scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架。
(注:Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。)
它可以分为以下几个部分:
2.数据流
scrapy中的数据流由引擎控制,数据流的过程如下。
(1)Engine首先打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取的URL。
(2)Engine从Spider中获取到第一个要爬取的URL,并通过Scheduler以Request的形式调度
(3)Engine向Scheduler请求下一个要爬取的URL
(4)Scheduler返回下一个要爬取的URL给Engine,Engine将URL通过DownLoader Middlewares转发给Downloader下载
(5)一旦页面下载完成,Downloader生成该页面的Response,并将其通过Downloader Middlewares发送给Engine
(6)Engine从下载器中接收到Response,并将其通过Spider Middlewares发送给Spider处理。
(7) Spider处理Response,并返回爬取到的Item及新的Request给Engine
(8)Engine将Spider返回的Item给Item Pipeline,将新的Request给Scheduler
(9)重复第(2)步到第(8)步,直到Scheduler中没有更多的Request,Engine关闭该网站,爬取结束
3.Scrapy运作流程
代码写好,程序开始运行
1.引擎:Hi!Spider, 你要处理哪一个网站?
2.Spider:老大要我处理xxxx.com。
3.引擎:你把第一个需要处理的URL给我吧。
4.Spider:给你,第一个URL是xxxxxxx.com。
5.引擎:Hi!调度器,我这有request请求你帮我排序入队一下。
6.调度器:好的,正在处理你等一下。
7.引擎:Hi!调度器,把你处理好的request请求给我。
8.调度器:给你,这是我处理好的request
9.引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求
10.下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
11.引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)
12.Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
13.引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
14.管道“调度器:好的,现在就做!
注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)
4.制作 Scrapy 爬虫 一共需要4步:
新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
明确目标 (编写items.py):明确你想要抓取的目标
5.项目结构
项目文件结构如下
scrapy.cfg
project/
__init__.py
items.py
pipelines.py
settings.py
middlewares.py
spiders/
__init__.py
spider1.py
spider2.py
...
1.创建一个项目,项目文件可以直接用scrapy命令生成,命令如下所示:
scrapy startproject tutorial
这个命令可以在任意文件夹运行。会创建一个名为tutorial的文件夹,文件夹结构如下:
scrapy.cfg #Scrapy部署时的配置文件
tutorial/ #项目的模块,需要从这里引入
__init__.py
items.py #Items的定义,定义爬取的数据结构
middlewares.py #Middlewares的定义,定义爬取时的中间件
pipelines.py #Pipelines的定义,定义数据管道
settings.py #配置文件
spiders/ #放置Spiders的文件夹
__init.py__
2.创建Spider
Scrapy用它来从网页里爬取内容,并解析抓取的结果。不过这个类必须继承Scrapy提供的Spider类scrapy.Spider,还要定义Spider的名称和起始请求,以及怎样处理爬取后的结果的方法。
使用如下命令创建一个名为Quotes的Spider
scraoy genspider qoutes qoutes.toscrapy.com
第一个参数是Spider的名称,第二个参数是网站域名。
爬虫中有三个属性——name,allowed_domails和start_urls,还有一个方法parse。
name:它是每个项目唯一的名字,用来区分不同的Spider
allowed_domails:它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
start_urls:它包含了Spider在启动时爬取的url列表,初始请求是由它来定义的
parse:它是Spider的一个方法。默认情况下,被调用时start_urls里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数。该方法负责解析返回的响应,提取数据或者进一步生成要处理的请求。
3.创建itesm
Item是保存爬取诗句的容器,它的使用方法和字典类似。
创建item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段
Scrapy提供了自己的数据提取方法,即Selector(选择器)。Selector是基于lxml来构建的,支持Xpath选择器、CSS选择器以及正则表达式。
例:
name = node.xpath(”./h3/text()”).extract
scrapy爬取到的为xpath对象,extarct()将xpath对象序列化为unicode字符串并返回list。
1.直接使用
from scrapy import Selector
title = selector.xpath('//title/text()').extract_first()
这里没有在Scrapy框架中运行,而是把Scrapy中的Selector单独拿出来使用了。构造时传入text参数,就生成了一个Selector选择器对象。
2.Scrapy shell
借助Scrapy来模拟scrapy的请求过程。
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
我们就进入到了Scrapy shell模式。这个过程就是Scrapy发起一次请求,请求URL就是刚才命令行下输入的URL。
我们可以在命令行模式下输入命令调用对象的一些操作方法。
1.Spider的运行流程
Spider要做的事就是如下两件:
分析爬取下来的网页
对于Spider类来说,整个爬取循环的过程如下所述
以初始的URL初始化Request,并设置回调函数。当该Request成功请求并返回时,Response生成并作为参数传给该回调函数。
2.Spider类分析
我们定义的Spider是继承自scrapy.spiders.Spider。
scrapy.spiders.Spider这个类提供了start_requests()方法的默认实现,读取并请求start_urls属性,并根据返回的结果调用parse()方法解析结果。
基础属性解释:
crawler:它是由from_crawler()方法设置的,代表的是本Spider类对应的Crawler对象。Crawler对象包含了很多项目组件,利用它我们可以获取项目的一些配置信息,如最常见的获取项目的设置信息,即Settings
Spider的常用方法:
Downloader Middleware即下载中间件,它是处于Scrapy的Request和Response之间的处理模块。
Downloader Middleware在整个架构中起作用的位置是以下两个:
在下载后生成的Response的Response发送给Spider之前,也就是我们可以生成Response被Spider解析之前对其进行修改。
1.使用说明
Scrapy提供了一个设置变量DOWNLOADER_MIDDLEWARES,我们直接修改这个变量就可以添加自己定义的Downloader Middleware,以及禁用DOWNLOADER_MIDDLEWARES_BASE里面定义的Downloader Middleware。
2.核心方法
核心方法如下三个:
我们只需要实现至少一个方法就可以定义Downloader Middleware。
持续更新中。。。