2018-10-30
Scrapy框架中Spiders用法
原文地址:https://www.cnblogs.com/zhaof/p/7192503.html
Spider类定义了如何去爬取某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页。
工作流程分析
- 以初始的URL初始化Request,并设置回调函数,当该Request下载完毕并返回时,将生产Response,并作为参数传给回调函数。spider中初始的Request是通过start_request()来获取的,start_request()获取start_urls的URL,并以parse回调函数生产Request。
- 在回调函数内分析返回的网页内容,可以返回Item对象,或者DIct,或者Request,以及是一个包含三者的可迭代容器。返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数。
- 在回调函数内,可以通过lxml,bs4,xpath,css等方法获取我们想要的内容生成item
- 最后将item传递给Pipeline处理
我们以通过简单的分析源码来理解
我通常在写spiders下写爬虫的时候,我们并没有写start_requests来处理start_urls中的url,这是因为我们在继承的scrapy.Spider中已经写过了,我们可以点开scrapy.Spider查看分析


通过上述代码我们可以看到在父类里这里实现了start_requests方法,通过make_requests_from_url做了Request请求
如下图所示的一个例子,parse回调函数中的response就是父类列start_requests方法调用make_requests_from_url返回的结果,并且在parse回调函数中我们可以继续返回Request,如下属代码中yield Request()并设置回调函数。

spider内的一些常用属性
我们所有自己写的爬虫都是继承spider.Spider这个类
name:定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的
allowed_domains:包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问
所以在爬虫文件中,每次生成Request请求时都会和这里的域名判断
start_urls:起始的URL列表,这里会通过spider.SPider方法中调用start_request循环请求这个列表中每个地址
custom_settings:自定义配置,可以覆盖setting的配置,主要用于当我们队爬虫有特定需求设置的时候
设置的是以字典的方式设置:custom_settings={}
from_crawler:这是一个类方法,我们定义这样一个类方法,可以通过crawler.setting.get()这种凡是获取settings配置文件中的信息,同时这个也可以在pipeline中使用
start_requests():这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求,这个方法是在被继承的父类中spider.spider中写的,默认是通过get请求,如果我们需要修改最开始的请求,可以重写这个方法,如果我们想通过post请求
parse(response)
这个其实默认的回调函数
负责处理response并返回处理的数据以及跟进的url
该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象
Y's Blog
