Scrapy

If you only do what you can do, you will never be more than you are now. ——《功夫熊猫3》

如果你只做力所能及的事情, 你就没办法进步。

什么是 Scrapy

  Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

  Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

  截止2020年11月16日,Scrapy最新版本为2.4,Python版本最低要求3.6+,适用于Linux,Windows,macOS,BSD

Scrapy 官方站点

   github地址:https://github.com/scrapy/scrapy
   官方社区:https://scrapy.org/
   官方文档:https://docs.scrapy.org/en/latest/

安装 Scrapy

1
pip install scrapy

你也可以指定源,一般这样会快很多。

1
pip install scrapy -i https://pypi.douban.com/simple

  如果你的scrapy是很早之前安装的,你也可以使用下面的命令进行升级安装。

1
pip install scrapy -i --upgrade https://pypi.douban.com/simple

  我在使用上面的命令进行更新时出现了以下错误:

  意思是:gerapy 0.9.2 版本要求 pymysql 的版本为 0.7.10,但是您的 pymysql 版本为 0.10.1,这是不兼容的。不过在上图的最后一行中,我们可以了解到 scrapy 是更新成功的。

  使用下面的命令查看scrapy 现在的版本。确定scrapy是更新成功了。既然安装成功就暂时先不管这些小问题了。

1
scrapy --version

  使用 pip install scrapy 安装,极可能会遇到 Twisted 安装报错以及其他包版本的错误。
  关于 Twisted 可以在这个网站下载:https://pypi.org/project/Twisted/#files
  在下载之前一定要先确定你机器上的Python版本,在cmd中输入python即可,如下图:

  可以看出我的python版本是3.7,机器是64位机器,那么我就可以下载下图所示版本:

  下载完成之后 使用 win + R 输入cmd 打开命令窗口,并输入 pip install 然后将你下载好的Twisted文件拖进命令窗口,然后回车即可安装。

  安装完 Twisted 再次执行 pip install scrapy 命令进行安装,如果遇到其他包版本问题,按照错误提示安装指定版本的包即可。

  当然我最推荐的安装方式是:先安装anaconda,然后安装scrapy,这样可以避免很多错误以节约时间。关于anaconda的下载可以到清华大学开源软件镜像站,关于镜像源的更换可以看百度经验 - anaconda清华源更换这篇文章。

  在清华源镜像站中 Anaconda3-2020.02-Windows-x86_64.exe 是最新的支持python3.7的版本,Anaconda3-2020.07-Windows-x86_64.exe是最新的支持python3.8的版本,关于其他版本可自行安装测试。

Scrapy架构

Scrapy 组件

1、Scrapy Engine (引擎):
  负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

2、Scheduler (调度器):
  负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

3、Downloader (下载器):
  负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。

4、Spider (爬虫):
  负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。

5、Item Pipeline (管道):
  负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。

6、Downloader Middlewares (下载中间件):
  介于Scrapy引擎和下载器之间的中间件,可以自定义扩展下载功能的组件。

7、Spider Middlewares (爬虫中间件):
  介于Scrapy引擎和爬虫之间的中间件,可以自定义扩展操作引擎和爬虫中间通信的功能组件。

8、Scheduler Middlewares(调度中间件):
  介于Scrapy引擎和调度之间的中间件,可以自定义扩展操作引擎和调度器中间通信的功能组件。

Scrapy 运行流程

1、Spider:Engine,Engine 起来干活了!Spider 将 第一个 requests 发送给 Engine (引擎)
2、Engine:知道了! Engine 对 requests 不做任何的处理就发送给 Scheduler (调度器)
3、Scheduler:看了一眼这个 requests,Scheduler 将 requests 发送给 Engine (引擎) ,并告诉引擎:你把它交给 Downloader (下载器)
4、Engine:知道了! Engine 默默地将 requests (Downloader Middlewares中process_request进行处理) 发送给 Downloader (下载器)
5、Downloader:Engine,你看,我下载好了,快夸夸我。Downloader 将 response (Downloader Middlewares中process_response进行处理) 发送给 Engine (引擎)
6、Engine:知道了!Engine 将 response 交给 spider (爬虫)
7、Spider:Engine,Engine 我处理好了。Spider 将 item 以及下一个 requests 发送给Engine (引擎)
8、Engine:知道了!Engine 将 item 交给 Item Pipeline (管道) 过滤储存,将下一个 requests 发送给 Scheduler (调度器)

  如果你只有一个链接需要抓取,那么在第8步的时候 Engine 将 item 交给 Item Pipeline 后,Engine就会停止,直至 Item Pipeline处理完所有的 item ,整个程序才算停止。在后面我会举例子证明这一点。如果你有很多的链接需要抓取,那么这个流程就是:1 ——> 2 ——> 3 ——> 4 ——> 5 ——> 6 ——> 7 ——> 8 ——> 3 ——> 4 ——> 5 ——> 6 ——> 7 ——> 8 ——> 3 ——> … … ——> 8 。直至所有 item 处理完成,程序停止。

文中提到的网站

Scrapy | github, Scrapy | 官方社区, Scrapy | 官方文档, pypi | Twisted, 清华大学开源软件镜像站, 百度经验 | anaconda清华源更换

未完待续 …