〖Python网络爬虫实战③〗- 爬虫的基本原理

news/2024/7/19 8:44:24 标签: 爬虫, python, pycharm, javascript
  • 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+

                python项目实战

                Python编程基础教程系列(零基础小白搬砖逆袭)

  • 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,可报销(名额有限,先到先得)
  • 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。

 最近更新

〖Python网络爬虫实战①〗- HTTP原理

〖Python网络爬虫实战②〗- Web网页基础

〖Python网络爬虫实战③〗-爬虫的基本原理

🌟上节回顾

我们上一节讲述了网页的基本结构和节点间的关系,在拥有了上节的基础上,我们现在来说说爬虫的原理,什么是爬虫,是怎么爬取的。通过本文,你就会有所了解。

⭐️爬虫的基本原理

我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。

🌟爬虫概述

简单来说,爬虫就是获取网页并提取和保存信息的自动化程序,下面概要介绍一下。

  • ✨获取网页

爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了。

前面讲了请求和响应的概念,向网站的服务器发送一个请求,返回的响应体便是网页源代码。所以,最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来,那么这个流程怎样实现呢?总不能手工去截取网页源码吧?

不用担心, Python 提供了许多库来帮助我们实现这个操作,如 urllib 、 requests 等。我们可以用这些库来帮助我们实现 HTTP 请求操作,请求和响应都可以用类库提供的数据结构来表示,得到响应之后只需要解析数据结构中的 Body 部分即可,即得到网页的源代码,这样我们可以用程序来实现获取网页的过程了。

  • ✨提取信息

获取网页源代码后,接下来就是分析网页源代码,从中提取我们想要的数据。首先,最通用的方法便是采用正则表达式提取,这是一个万能的方法,但是在构造正则表达式时比较复杂且容易出错。
另外,由于网页的结构有一定的规则,所以还有一些根据网页节点属性、 CSS 选择器或 XPath 来提取网页信息的库,如 Beautiful Soup 、 pyquery 、 Ixml 等。使用这些库,我们可以高效快速地从中提取网页信息,如节点的属性、文本值等。

提取信息是爬虫非常重要的部分,它可以使杂乱的数据变得条理清晰,以便我们后续处理和分析数据。

  • ✨保存数据

提取信息后,我们一般会将提取到的数据保存到某处以便后续使用。这里保存形式有多种多样,如可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySQL 和 MongoDB 等,也可保存至远程服务器,如借助 SFTP 进行操作等。

  • ✨自动化程序

说到自动化程序,意思是说爬虫可以代替人来完成这些操作。首先,我们手工当然可以提取这些信息,但是当量特别大或者想快速获取大量数据的话,肯定还是要借助程序。爬虫就是代替我们来完成这份爬取工作的自动化程序,它可以在抓取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行。

🌟抓怎样的数据

在网页中我们能看到各种各样的信息,最常见的便是常规网页,它们对应着 HTML 代码,而最常抓取的便是 HTM 源代码。

另外,可能有些网页返回的不是 HTML 代码,而是一个 JSON 字符串(其中 API 接口大多采用这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便。

此外,我们还可以看到各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。

另外,还可以看到各种扩展名的文件,如 CSS 、 JavaScript 和配置文件等,这些其实也是最普通的文件,只要在浏览器里面可以访问到,就可以将其抓取下来。

上述内容其实都对应各自的 URL ,是基于 HTTP 或 HTTPS 协议的,只要是这种数据,爬虫都可以抓取。

🌟JavaScript 渲染

有时候,我们在用 urlib 或 requests 抓取网页时,得到的源代码实际和浏览器中看到的不一样。这是一个非常常见的问题。现在网页越来越多地采用 Ajax 、前端模块化工具来构建,整个网页可能都是由 JavaScript 渲染出来的,也就是说原始的 HTML 代码就是一个空壳,例如:
 

< Script src =" app . js "></ script >

这段代码将 app.js 文件的 JavaScript 代码包含在内,我们在用 urlib 或 requests 等库请求当前页面时,我们得到的只是这个 HTML 代码,它不会帮助我们去继续加载这个 JavaScript 文件,这样也就看不到浏览器中的内容了。这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。

因此,使用基本 HTTP 请求库得到的源代码可能跟浏览器中的页面源代码不太一样。对于这样的情况,我们可以分析其后台 Ajax 接口,也可使用 Selenium 、 Splash 这样的库来实现模拟JavaScript 渲染。

我们后面也会提到,我们先知道原理,后面我们在讲方法。

🌟总结

这里介绍了爬虫的一些基本原理,这可以帮助我们在后面编写爬虫时更加得心应手。


http://www.niftyadmin.cn/n/193076.html

相关文章

Code Two Exchange Crack

CodeTwo Exchange 迁移允许直接从早期版本的 Exchange&#xff08;从 Exchange 2010 开始&#xff09;安全、轻松地迁移到 Exchange 2019 和 2016。此服务器应用程序还允许您集中管理来自 Microsoft 365 (Office 365) 的邮箱迁移以及来自基于 IMAP 的电子邮件系统&#xff08;例…

面向对象编程(基础)8:关键字:package、import

目录 8.1 package(包) 8.1.1 语法格式 说明&#xff1a; 8.1.2 包的作用 8.1.3 应用举例 举例2&#xff1a;MVC设计模式 8.1.4 JDK中主要的包介绍 8.2 import(导入) 8.2.1 语法格式 8.2.2 应用举例 8.2.3 注意事项 8.1 package(包) package&#xff0c;称为包&#x…

PCB如何消除电源噪声?六个技巧教你轻松搞定

在高频PCB设计中&#xff0c;电源噪声无疑是最常见的电磁干扰现象&#xff0c;也是许多小白工程师最怕遇见的设计难点&#xff0c;如果在PCB设计时没有很好处理电源噪声&#xff0c;很容易对后续高频信号造成很大的影响&#xff0c;甚至电路无法正常运行&#xff0c;不仅浪费时…

SpringBoot案例

SpringBoot案例5&#xff0c;案例5.1 创建工程5.2 代码拷贝5.3 配置文件5.4 静态资源目标 基于SpringBoot的完成SSM整合项目开发 5&#xff0c;案例 SpringBoot 到这就已经学习完毕&#xff0c;接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。我们完…

MyBatis-Plus 分页查询以及自定义sql分页

一、引言 分页查询每个人程序猿几乎都使用过&#xff0c;但是有部分同学不懂什么是物理分页和逻辑分页。 物理分页&#xff1a;相当于执行了limit分页语句&#xff0c;返回部分数据。物理分页只返回部分数据占用内存小&#xff0c;能够获取数据库最新的状态&#xff0c;实施性…

C#,初学琼林(04)——查询(搜索)数组内指定(值)的元素与全文检索“倒排序”技术的实现代码源程序

假设我们有一个 n 元素数组&#xff0c;我们想在其中找到给定元素 x 的元素。a 是一个索引从 0 到 n-1 的数组 。它的元素将被标记为&#xff1a;a[0], a[1]&#xff0c;a[2]&#xff0c;a[3]&#xff0c;...&#xff0c;a[n-1]。 要找到 x 元素&#xff0c;我们将采取以下步骤…

ArrayList、LinkedList集合源码

一、ArrayList集合源码 1、ArrayList的特点 数据结构&#xff1a;基于数组实现&#xff0c;类型&#xff1a;object类型&#xff1b;存放元素&#xff1a;有序&#xff0c;可重复&#xff1b;线程是否安全&#xff1a;不安全&#xff0c;效率高。&#xff08;没有加上锁机制&a…

Python迭代器是什么?

1.迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束&#xff0c;迭代器只能往前不会后退。 2.可迭代对象&#xff08;for 循环遍历的数据类型&#xff09; 一类是集…