scrapy 的流程
其流程可以描述如下:
调度器把 requests--> 引擎 --> 下载中间件 ---> 下载器
下载器发送请求, 获取响应 ----> 下载中间件 ----> 引擎 ---> 爬虫中间件 ---> 爬虫
爬虫提取 url 地址, 组装成 request 对象 ----> 爬虫中间件 ---> 引擎 ---> 调度器
爬虫提取数据 ---> 引擎 ---> 管道
管道进行数据的处理和保存
注意:
图中绿色线条的表示数据的传递
注意图中中间件的位置, 决定了其作用
注意其中引擎的位置, 所有的模块之前相互独立, 只和引擎进行交互
scrapy 中每个模块的具体作用
1.scrapy 项目实现流程
创建一个 scrapy 项目: scrapy startproject 项目名
生成一个爬虫: scrapy genspider 爬虫名 允许爬取的范围
提取数据: 完善 spider, 使用 xpath 等方法
保存数据: pipeline 中保存数据
2. 创建 scrapy 项目
命令: scrapy startproject +< 项目名字 >
示例: scrapy startproject myspider
生成的目录和文件结果如下:
settings.py 中的重点字段和内涵
USER_AGENT 设置 ua
ROBOTSTXT_OBEY 是否遵守 robots 协议, 默认是遵守
CONCURRENT_REQUESTS 设置并发请求的数量, 默认是 16 个
DOWNLOAD_DELAY 下载延迟, 默认无延迟
COOKIES_ENABLED 是否开启 cookie, 即每次请求带上前一次的 cookie, 默认是开启的
DEFAULT_REQUEST_HEADERS
设置默认请求头
SPIDER_MIDDLEWARES 爬虫中间件, 设置过程和管道相同
DOWNLOADER_MIDDLEWARES
下载中间件
创建爬虫
命令: scrapy genspider +< 爬虫名字 > + < 允许爬取的域名 >
生成的目录和文件结果如下:
完善 spider
完善 spider 即通过方法进行数据的提取等操做:
注意:
response.xpath 方法的返回结果是一个类似 list 的类型, 其中包含的是 selector 对象, 操作和列表一样, 但是有一些额外的方法
extract() 返回一个包含有字符串的列表
extract_first() 返回列表中的第一个字符串, 列表为空没有返回 None
spider 中的 parse 方法必须有
需要抓取的 url 地址必须属于 allowed_domains, 但是 start_urls 中的 url 地址没有这个限制
启动爬虫的时候注意启动的位置, 是在项目路径下启动
数据传递到 pipeline
为什么要使用 yield?
让整个函数变成一个生成器, 有什么好处呢?
遍历这个函数的返回值的时候, 挨个把数据读到内存, 不会造成内存的瞬间占用过高
python3 中的 range 和 python2 中的 xrange 同理
注意:
yield 能够传递的对象只能是: BaseItem,Request,dict,None
6. 完善 pipeline
pipeline 在 settings 中能够开启多个, 为什么需要开启多个?
不同的 pipeline 可以处理不同爬虫的数据
不同的 pipeline 能够进行不同的数据处理的操作, 比如一个进行数据清洗, 一个进行数据的保存
pipeline 使用注意点
使用之前需要在 settings 中开启
pipeline 在 setting 中键表示位置 (即 pipeline 在项目中的位置可以自定义), 值表示距离引擎的远近, 越近数据会越先经过
有多个 pipeline 的时候, process_item 的方法必须 return item, 否则后一个 pipeline 取到的数据为 None 值
pipeline 中 process_item 的方法必须有, 否则 item 没有办法接受和处理
process_item 方法接受 item 和 spider, 其中 spider 表示当前传递 item 过来的 spider
来源: https://www.cnblogs.com/skaarl/p/11919540.html