Scrapy介绍
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以帮助用户简单快速的部署一个专业的网络爬虫。如果说前面我们写的定制bs4爬虫是”手动挡“,那Scrapy就相当于”半自动档“的车。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
所谓网络爬虫,就是抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
整体架构
- 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。这个模块相当于整个框架的控制中心,他控制着所有模块的数据流交换,并根据不同的条件触发相对应的事件,同样,这个模块也是不需要我们编写的。
- 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。这个模块对所有的爬取请求,进行调度管理,同样也是不需要我们写的模块。通过简单的配置就能达到更加多线程,并发处理等等强大功能。
- 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。这个模块,是Scrapy帮我们做好的,不需要我们自己编写,直接拿来用就行,其主要功能就是从网上获取网页内容,类似于我们写的get_html函数,当然,比我们自己写的这个简单的函数要强大很多.
- 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
- 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。这个模块是需要我们手动实现的,他的主要功能是将我们爬取筛选完毕的数据写入文本,数据库等等。总之就是一个“本地化”的过程。
- 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
爬取流程
上图绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
数据流
Scrapy中的数据流由执行引擎控制,其过程如下:
- 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
- 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
- 引擎向调度器请求下一个要爬取的URL。
- 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
- 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
- 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
- Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
- 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
- (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
有关scrapy详细介绍,请查看官方文档,中文文档
下面上一个简单不能再简单的例子,我们以爬取zimuku.net为例,有利于进一步了解scrapy整个操作过程。
├── zimuku #外层目录
│ ├── __init__.py #初始化脚本
│ ├── __pycache__ #Python缓存文件。暂时无视
│ ├── items.py #Items代码模板,继承类自scrapy.Item
│ ├── middlewares.py #Middlewares代码模板(继承类)
│ ├── pipelines.py #Pipelines代码模板(继承类)
│ ├── settings.py #Scrapy爬虫的配置文件
│ └── spiders #Spiders代码模板目录 我们写爬虫的地方
│ ├── __init__.py
│ └── __pycache__
└── scrapy.cfg #部署爬虫的配置文件
第二步:cd zimuku
第三步:我们用命令行创建第一个Spider:scrapy genspider demo zimuku.net(demo可以任意定义,zimuku.net为要爬取到开始url)
我们来看看demo.py
# -*- coding: utf-8 -*-
import scrapy class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["zimuku.net"]
start_urls = ['http://zimuku.net/']
def parse(self, response):
pass
可以看到Scrapy已经帮我们把爬虫的框架写好了,我们只要在这个框架的基础上进行进一步的定制就可以了。
下面我们定制属于自己到内容:
# -*- coding: utf-8 -*-
import scrapy class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["zimuku.net"]
start_urls = ['http://zimuku.net/'] def parse(self, response):
'''
parse()函数接收Response参数,就是网页爬取后返回的数据
用于处理响应,他负责解析爬取的内容
生成解析结果的字典,并返回新的需要爬取的请求
'''
name = response.xpath('//b/text()').extract()[1]
items = {'name':name}
with open('name.txt','w') as f:
f.write(str(items))
好了,下面我们在终端运行,scrapy crawl demo
终端出现
INFO: Spider closed (finished)
表示爬取结束,我们打开项目文件夹,可以查看到name.txt文件,打开可以看到里面爬取到内容了。
OK,通过这个super简单的小例子,我们知道了Scrapy框架到底是如何运作的,
大家一定要跟着敲一遍才能更加熟悉哦。
链接:http://www.jianshu.com/p/a8aad3bf4dc4