Scrapy爬虫
Scrapy爬虫框架结构
爬虫框架是实现爬虫功能的一个软件结构和功能组件的集合
5+2结构
三个路径之一
1 Engine从Spider处获得爬取请求(Request)
2 Engine将爬取请求转发给Scheduler,用于调度
三个路径之二
3 Engine从Scheduler处获得下一个要爬取的请求
4 Engine将爬取请求通过中间件发送给Downloader
5 爬取网页后,Downloader形成响应(Response)
通过中间件发给Engine
6 Engine将收到的响应通过中间件发送给Spider处理
三个路径之三
7 Spider处理响应后产生爬取项(scraped Item)
和新的爬取请求(Requests)给Engine
8 Engine将爬取项发送给Item Pipeline(框架出口)
9 Engine将爬取请求发送给Scheduler
数据流的出入口
Engine控制各模块数据流,不间断从Scheduler处
获得爬取请求,直至请求为空
框架入口:Spider的初始爬取请求
框架出口:Item Pipeline
Scrapy爬虫框架解析
Engine(无需用户修改)
(1) 控制所有模块之间的数据流
(2) 根据条件触发事件
Downloader(无需用户修改)
根据请求下载网页
Scheduler(无需用户修改)
对所有爬取请求进行调度管理
Downloader Middleware(用户可以编写配置代码)
目的:实施Engine、Scheduler和Downloader
之间进行用户可配置的控制
功能:修改、丢弃、新增请求或响应
用户可以编写配置代
Spider (需要用户编写配置代码)
(1) 解析Downloader返回的响应(Response)
(2) 产生爬取项(scraped item)
(3) 产生额外的爬取请求(Request)
Item Pipelines (需要用户编写配置代码)
(1) 以流水线方式处理Spider产生的爬取项
(2) 由一组操作顺序组成,类似流水线,每个操
作是一个Item Pipeline类型
(3) 可能操作包括:清理、检验和查重爬取项中
的HTML数据、将数据存储到数据库
Spider Middleware(用户可以编写配置代码)
目的:对请求和爬取项的再处理
功能:修改、丢弃、新增请求或爬取项
Scrapy命令行
Scrapy常用命令
命令 | 说明 | 格式 |
---|---|---|
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] |
Scrapy爬虫实例一
演示HTML页面地址: http://python123.io/ws/demo.html
应用Scrapy爬虫框架主要是编写配置型代码
步骤1:建立一个Scrapy爬虫工程
选取一个目录(D:\pycodes\),然后执行如下命令:
d:\pycodes>scrapy startproject python123demo
生成目录
python123demo/ ————————外层目录
scrapy.cfg ————————部署Scrapy爬虫的配置文件
python123demo/ ——————Scrapy框架的用户自定义Python代码
__init__.py ——————初始化脚本
items.py ————————Items代码模板(继承类)
middlewares.py —————Middlewares代码模板(继承类)
pipelines.py ——————Pipelines代码模板(继承类)
settings.py ——————Scrapy爬虫的配置文件
spiders/ ————————Spiders代码模板目录(继承类)
__pycache__ ——————缓存目录,无需修改
spider目录
spiders/ ————————————Spiders代码模板目录(继承类)
init.py——————初始文件,无需修改
pycache/——————缓存目录,无需修改
内层目录结构 用户自定义的spider代码增加在此处
步骤2:在工程中产生一个Scrapy爬虫
进入工程目录(D:\pycodes\python123demo),然后执行如下命令:
d:\pycodes\python123demo>scrapy genspider demo python123.io
该命令作用:
(1) 生成一个名称为demo的spider
(2) 在spiders目录下增加代码文件demo.py
该命令仅用于生成demo.py,该文件也可以手工生成
demo.py文件
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['python123.io']
start_urls = ['http://python123.io/']
def parse(self, response):
pass
步骤3:配置产生的spider爬虫
配置:(1)初始URL地址(2)获取页面后的解析方式
步骤4:运行爬虫,获取网页
在命令行下,执行如下命令:
d:\pycodes\python123demo>scrapy crawl demo
demo爬虫被执行,捕获页面存储在demo.html
yield 关键字的使用
包含yield语句的函数是一个生成器
生成器每次产生一个值 (yield语句) ,函数被冻结,被唤醒后再产生一个值
生成器是一个不断产生值的函数
生成器的优势
生成器相比一次列出所有内容的优势:
1)更节省存储空间
2)响应更迅速
3)使用更灵活
Scrapy爬虫的基本使用
使用步骤
**步骤1:**创建一个工程和Spider模板
步骤2: 编写Spider
步骤3: 编写Item Pipeline
步骤4: 优化配置策略
数据类型
Request类
Response类
Item类
Request类
class scrapy.http.Request()
Request对象表示一个HTTP请求
由Spider生成,由Downloader执行
属性或方法 | 说明 |
---|---|
.url | Request对应的请求URL地址 |
.method | 对应的请求方法,‘GET’ 'POST’等 |
.headers | 字典类型风格的请求头 |
.body | 请求内容主体,字符串类型 |
.meta | 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 |
.copy() | 复制该请求 |
Response类
class scrapy.http.Response()
Response对象表示一个HTTP响应
由Downloader生成,由Spider处理
属性或方法 | 说明 |
---|---|
.url | Response对应的URL地址 |
.status | HTTP状态码,默认是200 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 一组标记 |
.request | 产生Response类型对应的Request对象 |
.copy() | 复制该响应 |
Item类
class scrapy.item.Item()
Item对象表示一个从HTML页面中提取的信息内容
由Spider生成,由Item Pipeline处理
Item类似字典类型,可以按照字典类型操作
Scrapy 爬虫提取信息的方法
Scrapy爬虫支持多种HTML信息提取方法:
• Beautiful Soup
• lxml
• re
• XPath Selector
• CSS Selector
CSS Selector的基本使用
<HTML>.css(‘a::attr(href)’).extract()
CSS Selector由W3C组织维护并规范