CrawlSpider

classscrapy.contrib.spiders.CrawlSpider

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

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

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

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

基本函数的调用顺序和Spider类一样。见(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):returnseen = 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)

Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)相关推荐

  1. ffdshow 源代码分析 9: 编解码器有关类的总结

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  2. ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  3. ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  4. ffdshow 源代码分析 5: 位图覆盖滤镜(总结)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  5. ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  6. ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  7. ffdshow 源代码分析1 : 整体结构

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  8. ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  9. Python爬虫scrapy框架的源代码分析

    scrapy框架流程图 推荐三个网址:官方1.5版本:https://doc.scrapy.org/en/latest/topics/architecture.html点击打开链接 官方0.24版本( ...

最新文章

  1. linux内核网络协议栈--kernel bridge转发逻辑(十一)
  2. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp
  3. parsel安装老是失败_Photoshop安装失败解决办法
  4. 生成高分辨率pdf_用于高分辨率图像合成的生成变分自编码器
  5. inttostr java_Delphi和Java实现webservice架构
  6. linux raid livecd,liveCD,liveDVD,binDVD版本区别Centos
  7. 计算机数值方法知识点,数值分析 全部 知识点.docx
  8. 基于node.js和oicq的qq机器人 制作回顾分析笔记
  9. maven的下载与安装教程(超详细)
  10. 基于jsp java的员工绩效考核管理系统
  11. 【PC】TP-LINK WDN5200 AP模式无网络连接权限解决
  12. Git基础-git恢复被删除的文件
  13. Matplotlib库学习笔记(4) pyplot的文本显示以及Latex的使用
  14. cei()、linspace()、arrange()、full()、eye()、empty()、random()
  15. 大白菜u盘装win10步骤图解
  16. 解决为什么电脑连接不上网络,应该如何查找问题
  17. Linux计算时间间隔
  18. 大屏电视开启观影新体验,震撼视听双重享受
  19. Zoom(多人手机云视频会议软件)
  20. 软件功能以图找图自动点击鼠标 发现一款非常好用的以图视图自动操作软件AI万控系统和大家分享一下全名叫“AI人工智能万控系统”

热门文章

  1. Android内存管理之道
  2. 陷阱~关于引用类型,请不要模棱两可!
  3. 有关Oracle角色管理
  4. 十佳自由Linux物理工具
  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block
  6. ffmpeg 解码rtp方法
  7. maven netbeans 导入_Maven - NetBeans
  8. android中textcolor属性,android – EditText和TextView textColorPrimary不遵循API lt;21的主题颜色...
  9. es文件浏览器鸿蒙,手机文件一团糟 八款安卓文件管理器来救急
  10. Python的f-strings格式化