Scrapy-CrawlSpider爬虫组件

Scrapy-CrawlSpider爬虫组件

转自: http://blog.csdn.net/LYNDLL/article/details/5082514
  
      Scrapy可能对很多人都是一个比较陌生的开源爬虫库,网上的资料也比较少,我也是最近才发现并决定学习使用的。

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为回调函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值