最后更新于
最后更新于
Spider类定义了如何爬取某个/某些网站, 包括了爬取的动作, 以及如何从网页的内容中提取结构化数据, Spider就是定义爬取的动作及分析某个网页的地方.
以初始的URL初始化Request, 并给Request设置回调函数. 当该request下载完毕并返回时, 将生成response, 并作为参数传给该回调函数
在回调函数内分析返回的内容, 返回Item
对象或者Request
或者一个包括二者的可迭代容器. 返回的Request对象之后会经过Scrapy处理, 下载相应的内容, 并调用设置的callback函数(相当于二次爬取)
在回调函数内, 可以使用选择器(Selectors)或lxml
等任何工具来分析网页内容, 并根据分析的数据生成item
由spider返回的item将被存到数据库或使用Feed exports
存入到文件中
在定义Spider(__init__
)的时候可以使用参数, 来修改其功能, 但启动这个spider是用命令来启动的, 可以使用-a
来传递需要的参数:
Scrapy中有多种通用的spider, 为一些常用的爬取情况提供方便. 主要有以下几种.
Spider是最简单的spider, 每个其他的spider必须继承自该类. Spider并没有提供什么特殊的功能, 其仅仅请求给定的start_urls
或start_request
, 并根据返回的结果(responses)调用spider的parse
方法.
其中比较重要的属性和方法如下.
定义spider名字的字符串. spider的名字定义了Scrapy如何定位, 并初始化spider, 所以其必须是唯一的. name是spider最重要的属性, 而且是必须的.
可选. 包含了spider允许爬取的域名(domain)列表(list), 域名不在列表中的URL不会被跟进.
URL列表. 当没有制定特定的URL时, spider将从该列表中开始进行爬取. 因此, 第一个被获取到的页面的URL将是该列表之一. 后续的URL将会从获取到的数据中提取.
配置字典, 定义爬虫的行为等. 将会覆盖项目整体配置, 如果配置键有重复的话.
该方法必须返回一个可迭代对象, 该对象包含了spider用于爬取的第一个Request. 当spider启动爬取并且未指定URL时, 该方法被调用. 当指定了URL时, make_requests_from_url()
将被调用来创建Request对象. 该方法仅仅会被Scrapy调用一次.
该方法的默认实现是使用start_urls
的url生成Request.
该方法接受一个URL并返回用于爬取的Request
对象. 该方法在初始化request时被start_requests()
调用,也被用于转化url为request.
默认实现中, 该方法返回的Request对象中, parse()
作为回调函数, dont_filter参数也被设置为开启.
当response没有指定回调函数时, 该方法是Scrapy处理下载的response的默认方法.
parse负责处理response并返回处理的数据以及(/或)跟进的URL(Spider对其他的Request的回调函数也有相同的要求, 即request的回调函数是用来处理请求完毕后的response的).
该方法及其他的Request回调函数必须返回一个包含Request及(或)Item的可迭代的对象.
使用scrapy.log.msg()
方法记录(log)message. log中自动带上该spider的name
属性.
当spider关闭时, 该函数被调用.
爬取一般网站常用的spider. 定义了一些规则(rule)来提供跟进link的方便的机制. 提供了一个新的属性:
rules
一个包含一个(或多个)Rule
对象的集合(list). 每个Rule
对爬取网站的动作定义了特定表现. 如果多个rule匹配了相同的链接, 则根据他们在本属性中被定义的顺序, 第一个会被使用.
也提供了一个可复写(overrideable)的方法:
parse_start_url(response)
当start_url的请求返回时, 该方法被调用. 该方法分析最初的返回值并必须返回一个Item
对象或者一个Request对象或者一个可迭代的包含二者对象.
上面说到的Rule为scrapy.contrib.spiders.Rule
. 定义方法如下:
link_extractor: 是一个scrapy.contrib.linkextractors.LinkExtractor
对象. 其定义了如何从爬取到的页面提取链接
callback: 是一个callable或string, 如是string, 该spider中同名的函数将会被调用. 从link_extractor中每获取到链接时将会调用该函数, 该回调函数接受一个response
作为其第一个参数, 并返回一个包含Item以及(或)
Request`对象(或者这两者的子类)的列表(list).
避免使用parse
作为回调函数
cb_kwargs: 包含传递给回调函数的参数(keyword argument)的字典
follow: 布尔值, 指定了根据该规则从response提取的链接是否需要跟进. 如果callback
为None, follow默认设置为True, 否则默认为False
process_links: 是一个callable或string(该spider中同名的函数将会被调用). 从link_extractor中获取到链接列表时将会调用该函数. 该方法主要用来过滤
process_request: 是一个callable或string(该spider中同名的函数将会被调用). 该规则提取到每个request时都会调用该函数. 该函数必须返回一个request或者None
样例:
该spider将从example.com的首页开始爬取, 获取category以及item的链接并对后者使用parse_item
方法. 当item获得返回(response)时, 将使用XPath处理HTML并生成一些数据填入Item中.
CrawlSpider中使用Rule来从当前的网页内容中, 提取下一步需要处理的URL, 并进行下一步处理. 基础的Spider会将得到的response的回调函数指定为parse
方法. 但CrawlSpider使用Rule抽取下一步需要爬取的URL, 得到爬取结果后, Rule有两套方法进行处理.
上面是CrawlSpider处理每个response的方法
参考: