数据流的3个路径:
一:
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
框架入口:Spider的初试爬取请求
框架出口:Item Pipeline
各个模块(5+2结构):
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(用户可以编写配置代码)
目的:对请求和爬取项的再处理
功能:修改、丢弃、新增请求或爬取项
Scrapy爬虫实例:
演示HTML页面地址:http://python123.io/ws/demo.html
文件名称:demo.html
(1)建立一个Scrapy爬虫工程
在命令行中进入:E:\PythonProject,输入命令 scrapy startproject python123demo
建立了一个名为python123demo的工程,目录结构如下:
(2)在工程中建立一个spider爬虫
在命令行中进入:E:\PythonProject\python123demo,输入命令:scrapy genspider demo python123.io
之后生成一个名字为demo的spider,对应于Spiders文件夹下的demo.py文件
(3)打开demo.py文件,配置spider爬虫将指定网页内容存入demo.html文件中
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
#爬虫名称
name = 'demo'
#爬虫的约束区域,规定爬虫只爬取这个区域下的网页
allowed_domains=["python123.io"]
#爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
start_urls = ['http://python123.io/ws/demo.html']
#爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
def parse(self, response):
fname=response.url.split('/')[-1]
with open(fname,'wb') as f:
f.write(response.body)
pass
(4)运行爬虫,获取网页内容
在命令行中进入E:\PythonProject\python123demo,输入命令 scrapy crawl demo开始执行爬虫,
执行的结果被存储到html文件中
(5)优化配置,提升Scrapy爬虫的爬取速度
在settings.py文件中,有如下并发连接选项:
CONCURRENT_REQUESTS Downloader最大并发请求下载数量,默认32
CONCURRENT_ITEMS Item Pipeline最大并发ITEM处理数量,默认100
CONCURRENT_REQUESTS_PER_ DOMAIN 每个目标域名最大的并发请求数量,默认8
CONCURRENT_REQUESTS_PER_IP 每个目标IP最大的并发请求数量,默认0,非0有效
通过改变数量,可以提升或降低爬虫爬取的速度
Scrapy爬虫数据类型
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类似字典类型,可以按照字典类型操作