目录
一、简介
Scrapy是一个纯python语言编写的为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。它使用了 Twisted异步网络框架来处理网络通讯,让我们可以使用通过简单的设置就可以使用多线程的方式进行网络采集,而且包含了各种中间件接口,可以灵活的根据自己的需求进行修改请求、下载以及保存等。
Scrapy框架官方网址:http://doc.scrapy.org/en/latest
Scrapy中文维护站点:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
1. scrapy架构图
2. 各模块说明
- Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
- Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
- Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
- Downloader Middlewares(下载中间件):可以自定义扩展下载功能的组件,主要是处理Scrapy引擎与下载器之间的请求及响应。
- Spider Middlewares(Spider中间件):可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests),主要工作是处理爬虫的响应输入和请求输出
二、安装
1. linux系统
使用python解释器的pip 安装命令安装:pip3 install scrapy
2. windows系统
windows下安装twisted有可能会失败,先手动下载twisted包本地安装,在安装scrapy
1. 下载twisted
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
2. 安装twisted
进入下载目录,执行 pip3 install Twisted‑18.7.0‑cp36‑cp36m‑win_amd64.whl
3. 安装scrapy
pip3 install scrapy
三、创建项目
- 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:
scrapy startproject mySpider
执行命令后会生成一个文件夹,文件结构如下(mySpider为自定义项目名称):
各个文件说明:
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
2. 创建项目后,需要创建一个爬虫应用来进行编写爬虫内容,进入mySpider/spider目录下,执行命令:
scrapy genspider firstSpider 'www.baidu.com'
执行命令后会生成一个firstSpider文件,自定义爬虫就在此文件中编写。
firstSpider是爬虫名称,其实也可以由我们自行创建firstSpider.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦。
3. spider文件官方示例
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
def start_requests(self):
yield scrapy.Request('http://www.example.com/1.html', self.parse)
yield scrapy.Request('http://www.example.com/2.html', self.parse)
yield scrapy.Request('http://www.example.com/3.html', self.parse)
def parse(self, response):
for h3 in response.xpath('//h3').extract():
yield MyItem(title=h3)
for url in response.xpath('//a/@href').extract():
yield scrapy.Request(url, callback=self.parse)
要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。
- name = "" :这个爬虫的识别名称,启动时就是通过这个参数,必须是唯一的,在不同的爬虫必须定义不同的名字。
- allow_domains = [] :是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
- start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
- parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
1. 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
2. 生成需要下一页的URL请求。
四、启动
上一步创建firstSpider爬虫应用后,通过文件中name参数获取爬虫名称,这里是firstSpider
scrapy crawl firstSpider
五、scrapy其他命令
1. shell 测试功能
scrapy shell "http://www.baidu.com"
2. 获取爬虫列表
scrapy list
3. 检查错误
scrapy check
4. telnet 爬虫监控
telnet localhost 6023
telnet内部命令:
est ( ) : 查看爬虫引擎各组件的运行状态
p(stats.get_stats()) :查看爬虫已经运行的各项指标