Python数据预处理技术与实践
上QQ阅读APP看书,第一时间看更新

3.3 网络爬虫技术

网络数据采集是指通过网络爬虫或网站公开API等方式从网站上获取数据信息,该方法可以将半结构化数据、非结构化数据从网页中抽取出来,将其存储为统一的本地数据,支持图片、音频、视频等数据采集。

3.3.1 前置条件

可以搭建以下环境,进行网络爬虫的开发:

  • 软件系统:Windows 10/Linux。
  • 开发环境:Sublime Text3/PyCharm。
  • 数据库:MySQL 5.0+Navicat 10.0.11。
  • 编程语言:Python 3.7+Anaconda 4.4。
  • 爬虫框架:Scrapy。
  • 目标网站:http://blog.jobbole.com/all-posts/。

3.3.2 Scrapy技术原理

Scrapy是一个为爬取网站数据、提取结构化数据而设计的应用程序框架,通常我们可以很简单地通过Scrapy框架实现一个爬虫,抓取指定网站的内容或图片。

Scrapy爬虫完整架构如图3-2所示(此图来源于网络),其中箭头线表示数据流向。

图3-2 Scrapy架构图

  • Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通信,信号和数据传递等。
  • Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列和入队,当引擎需要时交还给引擎。
  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses(响应)交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
  • Spider(爬虫):它负责处理所有的Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
  • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行后期处理(详细分析、过滤、存储等)的地方。
  • Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
  • Spider Middlewares(Spider中间件):一个可以自定义扩展的操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses和从Spider出去的Requests)。

3.3.3 Scrapy新建爬虫项目

(1)安装Scrapy爬虫框架,按WIN+R组合键调出命令行环境,执行如下命令:

(2)按WIN+R组合键调出命令行环境进入根目录Chapter3文件夹下,创建爬虫项目:

如图3-3所示。

图3-3 创建BoLeSpider项目

(3)BoLeSpider为项目名称,可以看到将会创建一个名为BoLeSpider的目录,其目录结构大致如下:

下面简单介绍一下主要文件的作用,这些文件分别是:

  • scrapy.cfg:项目的配置文件。
  • BoLeSpider/:项目的Python模块,将会从这里引用代码。
  • BoLeSpider/items.py:项目的目标文件。
  • BoLeSpider/pipelines.py:项目的管道文件。
  • BoLeSpider/settings.py:项目的设置文件。
  • BoLeSpider/spiders/:存储爬虫代码的目录。

(4)在BoLeSpider项目下创建爬虫目录:

如图3-4所示。

图3-4 爬虫目标网站

(5)在同级目录下,执行如下命令,调用爬虫主程序。

如图3-5所示。

图3-5 运行爬虫项目

(6)在BoLeSpider目录下创建main.py:

执行main.py,效果如图3-6所示。

图3-6 封装main函数运行爬虫项目

main.py中的方法与在命令行环境下scrapy crawl jobbole的执行效果是一致的,之所以单独封装,是为了调试和运行的便利。

3.3.4 爬取网站内容

3.3.3节完成了爬虫项目的构建,接下来主要做4个方面的工作:一是对项目进行相关配置;二是对目标爬取内容分析及提取文本特征信息;三是完成数据爬取工作;四是将数据进行本地化存储。

1. 爬虫项目配置

在做数据爬取工作时,如果不符合爬虫协议爬取工作将会中断。比如遇到404错误页面等情况,爬虫会自动退出。显然,这不符合对爬虫结果的期望,我们希望跳过错误页面继续爬取。因此,为了实现对不符合协议的网页继续爬取,需要打开Scrapy爬虫架构中的setting.py文件进行修改,具体修改如下:

2. 分析爬取的内容

在文章列表http://blog.jobbole.com/all-posts/(实验时可正常访问,目前该官网处于关闭状态,读者重点明白原理及技术细节)中随机打开一篇文章,对单篇文章信息进行分析,并根据需求获取目标数据。假设需要获取文章的【新闻题目、创建时间、URL、点赞数、收藏数、评论数】,如图3-7所示。

图3-7 分析特征数据

3. 爬取文章数据

(1)获取单篇文章的数据有两种方式,分别是基于xpath和CSS的方法。基于xpath的方法操作过程是,使用http://blog.jobbole.com/114638/网址打开单篇文章,按F12键查看源代码,比如想获取文章,可以用光标选中题目的区域,并在右侧用鼠标右键单击源码处,再选中Copy,继续单击“Copy Xpath”。此时的路径为://*[@id="post-114638"]/div[1]/h1,如图3-8所示。

图3-8 xpath方法获取数据

(2)在命令行环境下执行以下shell命令:

(3)开始对每个特征进行测试,具体特征数据的测试代码如下:

(4)完整的特征数据的提取结果如图3-9所示。

图3-9 测试特征数据提取文本信息

注 意

有时候按照以上方法操作,但却没有提取到文本信息,则有可能是代码错误,请仔细检查代码。也有可能是反爬虫技术的作用,此时,需要登录后再进行数据爬取,这属于更深层次的爬虫技术,本文不再涉及。

(5)使用xpath方法获取数据。

以上逐个特征测试无误后,将代码放在Chapter3/BoLeSpider/BoLeSpider/spiders/jobbole.py文件中的parse方法下:

(6)使用CSS方法获取数据。

(7)获取页面信息(源代码见:Chapter3/BoLeSpider/BoLeSpider/spiders/jobbole.py)。

(8)运行main.py函数,获取到所有的信息,如图3-10所示。

图3-10 获取单篇文章特征数据

4. 爬取列表页所有文章

(1)实现列表页所有文章信息的爬取工作

按F12键分析网页,找到下一页并获取所有列表页的文章链接。

执行以下代码获取所有列表页的文章链接,如图3-11所示。

图3-11 获取列表页所有文章的链接

(2)设置目标特征的实体类

打开Scrapy框架内置的Chapter3/BoLeSpider/items.py文件,设计爬虫目标特征的实体类(这里可以将爬虫目标特征的实体类作为数据库操作中实体类来理解)。代码如下:

(3)修改代码文件jobbole.py

首先将BoLeSpider/spiders/jobbole.py文件的starturls修改为列表页的路径,然后在parse方法中解析文章,并提取下一页交给Scrapy提供下载。parsesdetail方法负责每一篇文章的下载,re_match方法是使用正则表达式对文本信息数据进行处理。完整的代码如下:

(4)运行main.py

提取列表页数据,如图3-12所示。

图3-12 获取列表页所有文章的特征数据