模块安装
Windows
安装 scrapy 需要安装依赖环境 twisted,twisted 又需要安装 C++ 的依赖环境
pip install scrapy 时 如果出现 twisted 错误
在 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的 Twisted 的版本文件(cp36 代表 python3.6 版本)
再 cmd 进入到 Twisted 所在的目录 执行 pip install 加 Twisted 文件名
最后执行 pip install scrapy
Ubuntu 安装注意事项
不要使用 python-scrapyUbuntu 提供的软件包, 它们通常太旧而且速度慢, 无法赶上最新的 Scrapy
要在 Ubuntu(或基于 Ubuntu)系统上安装 scrapy, 您需要安装这些依赖项
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
如果你想在 python3 上安装 scrapy, 你还需要 Python3 的开发头文件
sudo apt-get install python3-dev
在 virtualenv 中, 你可以使用 pip 安装 Scrapy:pip install scrapy
简单使用
新建项目
scrapy startproject project_name
编写爬虫
第一种方式: 创建单个文件
创建一个类, 它必须继承 scrapy.Spider 类, 需要定义三个属性
name: spider 的名字, 必须且唯一
start_urls: 初始的 url 列表
parse(self, response) 方法: 每个初始 url 完成之后被调用
这个 parse 函数要完成两个功能
1, 解析响应, 封装成 item 对象并返回这个对象
2, 提取新的需要下载的 url, 创建新的 request, 并返回它
单个文件的运行命令 scrapy runspider demo.py
第二种方式: 通过命令创建
scrapy genspider 爬虫名 域名
运行爬虫
scrapy list 查看可以运行的爬虫文件
scrapy crawl 爬虫名(name 属性的值)
追踪链接
创建一个类变量 page_num 用来记录当前爬取到的页码, 在 parse 函数中提取信息, 然后通过爬虫对象给变量 page__num 自加 1, 构造下一页的 url, 然后创建 scrapy.Request 对象并返回
如果 response 中提取不到信息, 我们判断已经到了最后一页, parse 函数直接 return 结束
定义 item 管道
parse 函数在解析出我们需要的信息之后, 可以将这些信息打包成一个字典对象或 scray.Item 对象, 然后返回
这个对象会被发送到 item 管道, 该管道会通过顺序执行几个组件处理它. 每个 item 管道组件是一个实现简单方法的 Python 类
它们收到一个 item 并对其执行操作, 同时决定该 item 是否应该继续通过管道或者被丢弃并且不再处理
item 管道的典型用途:
清理 html 数据
验证已删除的数据(检查项目是否包含某些字段)
检查重复项(并删除它们)
将已爬取的 item 进行数据持久化
编写管道类
- # 在爬虫启动时执行 def open_ spider(self, spider)
- # 在爬虫关闭时, 执行 def close_ spider(self, spider)
- # 对传递过来的 item 处理并 return 处理完的 item def process_ item(self, item, spider)
要激活这个管道组件, 必须将其添加到 ITEM_PIPELINES 设置中, 在 settings 文件中设置
在此设置中为类分配的整数值决定了它们运行的顺序: 按照从较低值到较高值的顺序进行
定义 item
Scrapy 提供了 Item 类
编辑项目目录下的 items.py 文件
在爬虫中导入我们定义的 Item 类, 实例化后用它进行数据结构化
运行流程
数据流
首先从爬虫获取初始的请求
将请求放入调度模块, 然后获取下一个需要爬取的请求
调度模块返回下一个需要爬取的请求给引擎
引擎将请求发送给下载器, 依次穿过所有的下载中间件
一旦页面下载完成, 下载器会返回一个响应包含了页面数据, 然后再依次穿过所有的下载中间件
引擎从下载器接收到响应, 然后发送给爬虫进行解析, 依次穿过所有的爬虫中间件
爬虫处理接收到的响应, 然后解析出 item 和生成新的请求, 并发送给引擎
引擎将已经处理好的 item 发送给管道组件, 将生成好的新的请求发送给调度模块, 并请求下一个请求
该过程重复, 直到调度程序不再有请求为止
组件
spiders 爬虫程序 处理 response 提取需要的数据 或其他要抓取的请求
engine 引擎 引擎负责控制系统所有组件之间的数据流, 并在发生某些操作时触发事件
scheduler 调度器 接收 request 请求 排队加入队列
download 下载器 负责引擎发送过来的 request 请求 进行下载
item pipelines 管道 负责 spider 返回的数据 进行存储
中间件
下载中间件
下载中间件是位于引擎和下载器之间的特定的钩子, 它们处理从引擎传递到下载器的请求, 以及下载器传递到引擎的响应
使用 Downloader 中间件执行以下操作
在请求发送到下载程序之前处理请求(即在 scrapy 将请求发送到网站之前)
在响应发送给爬虫之前
直接发送新的请求, 而不是将收到的响应传递给蜘蛛
将响应传递给爬行器而不获取 web 页面
默默的放弃一些请求
爬虫中间件
爬虫中间件是位于引擎和爬虫之间的特定的钩子, 能够处理传入的响应和传递出去的 item 和请求
使用爬虫中间件执行以下操作
处理爬虫回调之后的 请求或 item
处理 start_requests
处理爬虫异常
根据响应内容调用 errback 而不是回调请求
事件驱动的网络
scrapy 是用 Twisted 编写的, Twisted 是一个流行的事件驱动的 Python 网络框架. 它使用非阻塞 (也称为异步) 代码实现并发
来源: http://www.bubuko.com/infodetail-3280472.html