博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)
阅读量:4622 次
发布时间:2019-06-09

本文共 3384 字,大约阅读时间需要 11 分钟。

CrawlSpider

class
scrapy.contrib.spiders.
CrawlSpider

爬取一般站点经常使用的spider。其定义了一些规则(rule)来提供跟进link的方便的机制。 或许该spider并非全然适合您的特定站点或项目,但其对非常多情况都使用。 因此您能够以其为起点,依据需求改动部分方法。当然您也能够实现自己的spider。

除了从Spider继承过来的(您必须提供的)属性外,其提供了一个新的属性:

rules: Rule对象集合。定义了提取须要跟进url的一些规则。

parse_start_url(response):start_url的回调函数,返回Item或者Request对象的迭代。

基本函数的调用顺序和Spider类一样。见()

class CrawlSpider(Spider):    rules = ()    def __init__(self, *a, **kw):        super(CrawlSpider, self).__init__(*a, **kw)        self._compile_rules()    #首先调用parse()来处理start_urls中返回的response对象    #parse()则将这些response对象传递给了_parse_response()函数处理。并设置回调函数为parse_start_url()    #设置了跟进标志位True    #parse将返回item和跟进了的Request对象        def parse(self, response):        return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)        #处理start_url中返回的response。须要重写    def parse_start_url(self, response):        return []    def process_results(self, response, results):        return results        #从response中抽取符合任一用户定义'规则'的链接。并构造成Resquest对象返回    def _requests_to_follow(self, response):        if not isinstance(response, HtmlResponse):            return        seen = set()        #抽取之内的全部链接,仅仅要通过随意一个'规则'。即表示合法        for n, rule in enumerate(self._rules):            links = [l for l in rule.link_extractor.extract_links(response) if l not in seen]            #使用用户指定的process_links处理每一个连接            if links and rule.process_links:                links = rule.process_links(links)            #将链接增加seen集合,为每一个链接生成Request对象,并设置回调函数为_repsonse_downloaded()            for link in links:                seen.add(link)                #构造Request对象,并将Rule规则中定义的回调函数作为这个Request对象的回调函数                r = Request(url=link.url, callback=self._response_downloaded)                r.meta.update(rule=n, link_text=link.text)                #对每一个Request调用process_request()函数。

该函数默觉得indentify,即不做不论什么处理,直接返回该Request. yield rule.process_request(r) #处理通过rule提取出的连接。并返回item以及request def _response_downloaded(self, response): rule = self._rules[response.meta['rule']] return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow) #解析response对象,会用callback解析处理他。并返回request或Item对象 def _parse_response(self, response, callback, cb_kwargs, follow=True): #首先推断是否设置了回调函数。(该回调函数可能是rule中的解析函数。也可能是 parse_start_url函数) #假设设置了回调函数(parse_start_url())。那么首先用parse_start_url()处理response对象, #然后再交给process_results处理。返回cb_res的一个列表 if callback: #假设是parse调用的,则会解析成Request对象 #假设是rule callback,则会解析成Item cb_res = callback(response, **cb_kwargs) or () cb_res = self.process_results(response, cb_res) for requests_or_item in iterate_spider_output(cb_res): yield requests_or_item #假设须要跟进,那么使用定义的Rule规则提取并返回这些Request对象 if follow and self._follow_links: #返回每一个Request对象 for request_or_item in self._requests_to_follow(response): yield request_or_item def _compile_rules(self): def get_method(method): if callable(method): return method elif isinstance(method, basestring): return getattr(self, method, None) self._rules = [copy.copy(r) for r in self.rules] for rule in self._rules: rule.callback = get_method(rule.callback) rule.process_links = get_method(rule.process_links) rule.process_request = get_method(rule.process_request) def set_crawler(self, crawler): super(CrawlSpider, self).set_crawler(crawler) self._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)

转载于:https://www.cnblogs.com/jhcelue/p/7097350.html

你可能感兴趣的文章
OpenCV特征点检测——ORB特征
查看>>
mysql的csv数据导入与导出
查看>>
leetcode笔记:Pascal's Triangle
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
Shell——windows上写完放入linux的时候需要注意的问题
查看>>
65条常用的正则表达式
查看>>
Vscode断点调试PHP
查看>>
做前端要做的6大事
查看>>
LeetCode 813. Largest Sum of Averages
查看>>
vSphere、Hyper-V与XenServer 你选哪个?
查看>>
java.lang.UnsupportedClassVersionError
查看>>
实现接口必须要加注解@Override吗
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
java与数据结构(6)---java实现链栈
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>