爬虫Day2_爬虫基础

爬虫基础:

简单来说,爬虫就是请求网页并提取数据和保存信息的自动化程序

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



简单流程介绍

下面我们说说爬虫的具体流程,一般分为四步:

  1. 发起请求, 通过请求库对目标站点发起请求,我们可以模拟携带浏览器信息、cookie值、关键字查询等信息,从而访问服务器端,然后等待服务器的响应
  2. 解析内容: 服务器响应的内容有可能是HTML纯文本,也有可能是json格式的数据、或者是二进制(如图片视频),我们可以利用相关的解析库进行解析、保存或进一步处理。
  3. 处理信息:一般来说,我们使用解析库解析出来的内容,是冗杂晦涩的,我们通过用format或者切片等技术,使得内容清晰明了,这时,才算得上的有用的信息。 接下来,我们可以将信息存储到本地、数据库或者远程服务器等等。
  4. 爬虫优化:爬虫优化的方面有很多,例如,控制爬虫速率、使用高匿代理服务器、使用分布式爬取、处理异常…

接下来作者针对爬虫最重要的部分做出详细介绍:

获取网页

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

在前面我们讲到了 Request 和 Response 的概念,我们向网站的服务器发送一个 Request,返回的 Response 的 Body 便是网页源代码。

所以最关键的部分就是构造一个 Request 并发送给服务器,然后接收到 Response 并将其解析出来。在python3 中,相关的库有:urllib(python自带的库)、requests(优雅的第三方库)



提取信息

我们在第一步获取了网页源代码之后,接下来的工作就是分析网页源代码,从中提取我们想要的数据,首先最通用的方法便是采用正则表达式提取,这是一个万能的方法,但是在构造正则表达式的时候比较复杂且容易出错。

另外由于网页的结构是有一定规则的,所以还有一些根据网页节点属性、CSS 选择器或 XPath 来提取网页信息的库,如 BeautifulSoup、PyQuery、LXML 等,使用这些库可以高效快速地从中提取网页信息,如节点的属性、文本值等内容。

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



能抓取怎样的数据:

  • 常规网页, 也就是html源代码。有些网页返回的不是不是 HTML 代码,而是返回一个 Json 字符串(使用Ajax渲染的网页),API 接口大多采用这样的形式,方便数据的传输和解析,这种数据同样可以抓取,而且数据提取更加方便。

  • 二进制数据,如图片、视频、音频等等,我们可以利用爬虫将它们的二进制数据抓取下来,然后保存成对应的文件名即可。

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



JavaScript 渲染页面:

有时候我们在用 Urllib 或 Requests 抓取网页时,得到的源代码实际和浏览器中看到的是不一样的。

这个问题是一个非常常见的问题,现在网页越来越多地采用 Ajax、前端模块化工具来构建网页,整个网页可能都是由 JavaScript 渲染出来的,意思就是说原始的 HTML 代码就是一个空壳。

因此在用 Urllib Requests 等库来请求当前页面时,我们得到的只是这个 HTML 代码,它不会帮助我们去继续加载这个 JavaScript 文件,这样也就看不到浏览器中看到的内容了。


这也解释了为什么有时我们得到的源代码和浏览器中看到的是不一样的。

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

本期对爬虫基础原理的讲述就到这里了~ 下期预告:“urllib请求库的使用”