Scrapy-CrawlSpider爬虫组件
来源:互联网 发布:中国人口流动数据 编辑:程序博客网 时间:2024/06/10 00:17
Scrapy-CrawlSpider爬虫组件
Scrapy整体框架实现上与Django框架原理很相似,两者都强调松耦合,高度的抽象使编程简单、简洁化,与python设计
理念是一致的,可惜我没有参透python的禅宗,下来主要分析一下Scrapy中的CrawlSpider爬虫组件。
CrawlSpider是一个比较有用的组件,其通过正则表达匹配对应url并爬取,通过Xpath解析网页内容,再在新页面
抽取url继续爬取。CrawlSpider派生自InitSpider派生自BaseSpider(最基本爬虫组件).
CrawlSpider主要通过Rule类进行正则表达式的设定,设定相应的回调函数等.......
Rule类如下:
class Rule(object): def __init__(self, link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None): self.link_extractor = link_extractor self.callback = callback self.cb_kwargs = cb_kwargs or {} self.process_links = process_links if follow is None: self.follow = False if callback else True else: self.follow = follow
参数:link_extractor 一个url抽取器对象,通过它设定正则,允许匹配什么类型的url,不匹配那些都可以通过它设定
callback 回调函数可传函数的对象或者函数字符串表现形式,此回调函数主要处理抓取到的数据到Item对象
函数形式为:def 函数名(self,response[,**cb_kwargs])
cb_kwargs 回调函数参数 字典类型
follow 是否继续爬取,true 继续爬取,false 到此停止
process_link 是一个可选的回调函数,接受一个list参数(list元素是通过正则匹配返回url列表),此函数为什么
可选?主要是处理例如:list 参数里元素url是相对路径,可通过此回调处理加上域名形成一个完整的URL。反正是对路
径做一些附加处理。
CrawlSpider:
CrawlSpider类通过parse函数解析response
def parse(self, response): return self._response_downloaded(response, self.parse_start_url, cb_kwargs={}, follow=True)
parse 函数调用 _response_downloaded函数并返回,返回类型必须是Item 或 Request 对象的列表,这是
Scrapy 规定的。再看看_response_downloaded函数
def _response_downloaded(self, response, callback, cb_kwargs, follow): if callback: 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 if follow and settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True): for request_or_item in self._requests_to_follow(response): yield request_or_item
函数表达的意思为:
调用callback回调函数(如果callback实例函数有效),否则返回()空元组,callback返回的是item或Request对象list
一开始回调函数为parse_start_url 函数,如果不重写此函数相当于种子页面不处理。默认返回空list
调用process_results函数,此函数可重写,如果不重写,返回的是callback返回值(这里要慢慢看代码体会)
接下来通过follow判断完成通过正则抽取的URL的爬取,此时调用_requests_to_follow函数
def _requests_to_follow(self, response): seen = set() for rule in self._rules: links = [l for l in rule.link_extractor.extract_links(response) if l not in seen] if links and rule.process_links: links = rule.process_links(links) seen = seen.union(links) for link in links: r = Request(url=link.url) r.meta['link_text'] = link.text r.deferred.addCallback(self._response_downloaded, rule.callback, cb_kwargs=rule.cb_kwargs, follow=rule.follow) yield r
通过response参数传进当前页面信息,
seen = set() 防止正则抽取到一样的路径
循环通过对rule对象设置进行正则抽取,并过滤重复的url,接着通过process_links函数(前面提到的URL加工函数)
如果该函数对象实例存在。
通过links 列表循环调用Request对象进行进一步抓取。通过ddCallback(self._response_downloaded, rule.callback, cb_kwargs=rule.cb_kwargs, follow=rule.follow)设回调,self._response_downloaded为回调函数。
- Scrapy-CrawlSpider爬虫组件
- Scrapy-CrawlSpider爬虫组件
- Scrapy-CrawlSpider爬虫组件
- scrapy爬虫:CrawlSpider用法与总结
- Scrapy框架利用CrawlSpider创建自动爬虫
- Scrapy框架利用CrawlSpider创建自动爬虫
- 网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider
- Scrapy爬虫框架学习笔 二 CrawlSpider的使用
- 六.scrapy crawlspider
- Python爬虫系列之----Scrapy(九)使用CrawlSpider完善豆瓣图书爬虫
- Scrapy框架学习(四)----CrawlSpider、LinkExtractors、Rule及爬虫示例
- python scrapy爬虫 CrawlSpider 拉钩招聘网302重定向问题解决方案 , 修改setting信息,添加cookie请求
- scrapy学习(三) crawlspider源码解析
- 爬虫-06-CrawlSpider及源码分析
- Python爬虫入门-小试CrawlSpider
- scrapy爬虫
- Scrapy 爬虫
- scrapy爬虫
- 排序(二)——关于希尔排序
- Hi3521开发
- scrollTop与scrollLeft
- zzuli1619--发工资--用访问数组判断是否有环
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods
- Scrapy-CrawlSpider爬虫组件
- LINUX下USB1.1设备学习小记(5)_uhci与设备(1)
- Objective-C中的枚举类型
- zoj1119--双连通--寻找关节点---计算子网数
- poj3352--旅游岛修路--双连通--无向图邻接表的容量是边数量的2倍
- 记录一次IllegalStateException异常的解决过程
- hbase基本概念和hbase shell常用命令用法
- poj1236--强连通--tarjan--补强连通--最优分发
- MantisBT的邮件配置