scrapy
scrapy 是什么
scrapy是框架 类似于车子
-
采用异步框架 实现高效率的网络采集
-
最强大的框架 没有之一
scrapy 框架结构
Engine
- 控制有所模块之间的数据交流
- 根据条件触发事件
Spider
-
解析Downloader返回的响应 (Response)
-
产生爬取项 (scraped item)
-
产生额外的爬取请求 (Request)
需要用户编写配置代码
Spider Middleware
- 目的: 对请求和爬取项的再处理
- 功能: 修改、丢弃、新增请求或爬取项
需要用户编写配置代码
Scheduler
- 对所有爬取请求进行调度管理
Item Pipelines
-
以流水线方式处理Spider产生的爬取项。
-
由一组操作顺序组成,类似流水线,每个操作是一个 ItemPipeline 类型
-
可能操作包括: 清理、检验和查重爬取项中的HTML数据、将数据存储到数据库
需要用户编写配置代码
Downloader
- 根据请求下载网页
Downloader Middleware
- 目的:实施Engine、Scheduler和Downloader之间进行用户可配置的控制
- 功能: 修改、丢弃、新增请求或响应
scrapy 安装
-
pip install scrapy → 报:VC++14.0 Twisted
- 解决方案:离线安装 pip install xxx.whl
-
scrapy bench 运行的时候 → 报:win32
- 解决方案:
pip install pywin32
- 解决方案:
创建 scrapy 项目
-
使用命令行 cd 到 要创建 scrapy 项目的文件夹下
-
运行命令:
scrapy startproject xxx(项目名称)
创建爬虫文件
-
使用命令行 cd 到scrapy 项目的根文件夹下
-
运行命令:scrapy genspider Reptile_name(爬虫名称) domain_name(域名)
注意:
-
爬虫名字不得与项目名称一样
-
网站域名是允许爬虫采集的域名(限制爬虫数据采集范围)
-
爬虫文件
import scrapy # 导入scrapy
创建 爬虫类 并且继承自scrapy.Spider --> 最基础的类 scrapy共有5个爬虫类
class XicidailiSpider(scrapy.Spider):
name = 'xicidaili' # 爬虫名字 必须唯一
allowed_domains = ['www.xicidaili.com'] # 允许的域名(可以不要)
start_urls = ['http://www.xicidaili.com/'] # 开始采集的网站
# 解析响应数据 提取数据 或网址等 response响应数据
def parse(self, response):
pass
分析网站:
-
提取数据
-
正则表达式(基础 必会 难掌握)
-
xpath表达式 → 从HTML中提取数据(scrapy默认提取数据方式)
-
-
CSS表达式 → 从HTML中提取数据(不建议使用 scrapy中的CCS表达式是转成xpath表达式使用的)
- response.xpath(’’).get() get() → 得到一个元素 getall → 得到多个元素
-
运行爬虫:
-
scrapy crawl xxx(爬虫名称)
yield scrapy.Request(next_url, callback=self.parse) #生成器
# Request()发出请求 类似于requests.get()
# callback 是将发出去的请求得到的响应数据还交给自己处理
# 注意:回调函数 不写() 只写 函数名
-
执行程序并保存数据:
- scrapy crawl xxx(爬虫名称) -o xxx.json/.csv/.xml
scrapy 常用命令
命令 | 说明 | 格式 |
---|---|---|
startproject | 创建一个新工程 | scrapy startproject xxx_Spider(项目名称) |
genspider | 创建一个爬虫 | scrapy genspider Reptile_name(爬虫名称) domain_name(域名) |
settings | 获得爬虫配置信息 | scrapy genspider [options] |
crawl | 运行一个爬虫 | scrapy crawl xxx(爬虫名称) |
list | 列出工程中所有爬虫 | scrapy list |
shell | 启动URL调试命令行 | scrapy shell [url] |
requests 库 VS scrapy 框架
相同点
-
两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
-
两者可用性都好,文档丰富,入门简单
-
两者都没有处理js、提交表单、应对验证码等功能(可扩展)
不同点
requests | scrapy |
---|---|
页面级爬虫 | 网站级 |
功能库 | 框架 |
并发考虑不足,性能较差 | 并发性好,性能较高 |
重点在于页面下载 | 重点在于爬虫结构 |
定制灵活 | 一般定制灵活,深度定制困难 |
上手十分简单 | 入门稍难 |
技术路线的选择
- 非常小的需求,requests库
- 不太小的需求,scrapy框架
- 定制程度很高的需求(不考虑规模),自搭建框架,requests > scrapy
较差|并发性好,性能较高
重点在于页面下载|重点在于爬虫结构
定制灵活|一般定制灵活,深度定制困难
上手十分简单|入门稍难
技术路线的选择
- 非常小的需求,requests库
- 不太小的需求,scrapy框架
- 定制程度很高的需求(不考虑规模),自搭建框架,requests > scrapy