在cmd:pip install scrapy
Scrapy框架官方网址:http://doc.Scrapy.org/en/latest
Scrapy中文维护站点:http://Scrapy-chs.readthedocs.io/zh_CN/latest/index.html
如下所示:绿线是数据流向
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(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
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也会重新下载。)
Scrapy 爬虫步骤
一共需要4步:
新建项目 (Scrapy startproject xxx):新建一个新的爬虫项目
明确目标 (编写items.py):明确你想要抓取的目标
制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
存储内容 (pipelines.py):设计管道存储爬取内容
使用scrap框架:
1.新建项目:scrapy startproject 项目名
2.创建spdier:scrapy genspider spider名称 网址
一个模板生成spider内容如下:
import scrapy
class BaiduSpiderSpider(scrapy.Spider):#这个scrapy继承的是scrapy.Spider
name = 'baidu_spider' #spider的名称:作用是在启动spider需要指定名称
allowed_domains = ['www.baidu.com'] #允许爬取的域名:在下载的时候,会更具这个
域名进行过滤,url里面包含baidu的才会下载。
#如果以后发现没有获取到数据,首先你要看看这个字段是否设置错误。
start_urls = [‘https://www.baidu.com/’]#这个列表的作用,就是只需将起始url放入
到这个列表中,scrap就会自动的从这个列表中拿url,入队,下载。
#parse方法就是用来处理下载好的response的。response就是这个方法中的参数,返回的
response默认就是传给这个方法的。
def parse(self, response):
pass
3、启动spider:
scrapy crawl spider.name
首先需要把robots协议改成false,ROBOTSTXT_OBEY = False
第二步,设置请求头
USER_AGENT = ‘baidu (+http://www.yourdomain.com)’
或者
DEFAULT_REQUEST_HEADERS = {
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,
‘Accept-Language’: ‘en’,
}
用scrapy如何做分页:
第一种方法:
start_urls = []
#初始化start_urls
for i in range(10):
base_url = ‘https://maoyan.com/board/4?offset={}’.format(i*10)
start_urls.append(base_url)
提取数据的步骤:
1、在items.py中定义需要提取的字段
2、在parse方法中实例化这个类,就相当于我们之前创建的一个item字典
3、提取数据,将其设置到item中
response.xpath方法返回的是一个selector对象,这个对象就相当于你可以继续使用xpath方法来进
一步提取数据。
如果我们想获取这个对象的内容怎么办?
这个对象有两个方法:
extract() 列表中有多个selector使用
extract_first() 列表中有多个selector使用
yield的作用:
生成器-----执行包含yield的函数,这个函数就是一个生成器,每次函数就会卡在yield的位置,他
可以记录执行状态。如果用return,函数执行到return这里,返回值后,后面的值必须从头开始。
def get_num(num):
for i in range(num):
#return i
yield i
scrapy.Request这个对象,还有一些参数:
scrapy.Request(
url,
callback=self.parse_detail,
encoding=‘utf-8’
meta={},这个字典可以帮我们传递一些参数,到回调方法里面,做到了方法之间的通信。
)
数据保存到json文件
scrapy crawl name -o movie.json
用scrapy写爬虫的过程,就是不断地完善item这个对象的字段(数据),最后yield item的过程。
这个item最后跑到pipelines.py这个类中。
在pipelines 这个类中的item形参,只能接收到,四种类型的实参:字典,item对象,null,request
item对象是item.py中的类的实例化对象
想要使用pipeline,必须配置:
ITEM_PIPELINES = {
‘maoyan.pipelines.MaoyanPipeline’: 300,
}
还需要注意: