1 介绍
爬虫框架:
实现爬虫功能的一个软件结构和功能组件集合
一个半成品,能够帮助用户实现专业网络爬虫
2 框架结构
数据流的三个路径:
(1)
1.Engine从Spider处获得爬取请求(Request)
2.Engine将爬取请求转发给Scheduler,用于调度
(2)
3.Engine从Scheduler处获得下一个要爬取的请求
4.Engine将爬取请求通过中间件发送给Downloader
5.爬取网页后,Downloader形成响应(Response)通过中间件发给Engine
6.Engine将收到的响应通过中间件发送给Spider处理
(3)
7.Spider处理响应后产生爬取项(scraped Item)和新的爬取请求(Requests)给Engine
8.Engine将爬取项发送给Item Pipeline(框架出口)
9.Engine将爬取请求发送给Scheduler
各模块介绍
Engine
控制各模块数据流,不间断从Scheduler处获得爬取请求,直至请求为空
控制所有模块之间的数据流,根据条件触发事件
不需要修改
Downloader
根据请求下载网页
不需要用户修改
Scheduler
对所有爬取请求进行调度管理
不需要用户修改
Downloader Middleware
目的:实施Engine、Scheduler和Downloader之间进行用户可配置的控制功能
修改、丢弃、新增请求或响应
用户可以编写配置代码
Spider
解析Downloader返回的响应(Response)
框架入口,产生爬取项(scraped item)
产生额外的爬取请求(Request)
需要用户编写配置代码
Item Pipelines
以流水线方式处理Spider产生的爬取项
由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型
可能操作包括:清理、检验和查重爬取项中的HTML数据、将数据存储到数据库
需要用户编写配置代码
框架出口
Spider Middleware
目的:对请求和爬取项的再处理
功能:修改、丢弃、新增请求或爬取项
用户可以编写配置代
3 request VS .scrapy
相同点
两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
两者可用性都好,文档丰富,入门简单
两者都没有处理js、提交表单、应对验证码等功能(可扩展)
不同点
request VS .scrapy
页面级爬虫 网站级爬虫
功能库 框架
并发性考虑不足,性能较差 并发性好,性能较高
重点在于页面下载 重点在于爬虫结构
定制灵活 一般定制灵活,深度定制困难
上手十分简单 入门稍难
定制程度很高的需求(不考虑规模),自搭框架,requests > Scrapy
4 常用命令
命令行模式
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行
命令行(不是图形界面)更容易自动化,适合脚本控制
本质上,Scrapy是给程序员用的,功能(而不是界面)更重要
常用命令
命令行格式:scrapy <command> [options] [args]
- startproject 创建一个新工程 ------scrapy startproject <name> [dir]
- genspider 创建一个爬虫 ------scrapy genspider [options] <name> <domain>
- settings 获得爬虫配置信息 ------scrapy settings [options]
- crawl 运行一个爬虫 ------scrapy crawl <spider>
- list 列出工程中所有爬虫 -----scrapy list
- shell 启动URL调试命令行 ------scrapy shell [url]
5 示例
5.1 创建工程
命令:scrapy startproject python123demo
目录结构
python123demo/-----------------外层目录
scrapy.cfg-----------------部署Scrapy爬虫的配置文件
python123demo/-------------Scrapy框架的用户自定义Python代码
__init__.py------------初始化脚本
items.py---------------Items代码模板(继承类)
middlewares.py---------Middlewares代码模板(继承类)
pipelines.py-----------Pipelines代码模板(继承类)
settings.py------------Scrapy爬虫的配置文件
__pycache__/-----------缓存目录,无需修改
spiders/---------------Spiders代码模板目录(继承类)
__init__.py--------初始文件,无需修改
__pycache__/-------缓存目录,无需修改
5.2 创建爬虫
cd python123demo
scrapy genspider demo python123.io ## 仅用于在spiders目录下生成demo.py,该文件也可以手工生成
demo.py文件内容
import scrapy
class DemoSpider(scrapy.Spider): ##面向对象的类DemoSpider
name = 'demo' ## 当前爬虫名字
allowed_domains = ['python123.io'] ##提交给命令行的域名,仅可爬取该域名及以下相关链接
start_urls = ['http://python123.io/'] ## 一个或多个初始页面的地址
def parse(self, response): ## 解析页面的方法
pass ## 形成字典类型
5.3 配置爬虫
配置初始的Url地址
配置获取页面后的解析方式
5.4 爬取数据
scrapy crawl demo ## demo爬虫被执行,捕获页面存储在demo.html
6 demo.py
代码
对比