scrapy之CrawlSpider

简介

class scrapy.spiders.CrawlSpider

CrawlSpider是爬取一般网站常用的spider,适合于从爬取的网页中获取link并继续爬取的场景。
除了从Spider继承过来的性外,其提供了一个新的属性rules,它是一个Rule对象列表,每个Rule对象定义了种义link的提取规则,如果多个Rule匹配一个连接,那么根据定义的顺序使用第一个。

例子

from coolscrapy.items import HuxiuItem
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class LinkSpider(CrawlSpider):
    name = "link"
    allowed_domains = ["huxiu.com"]
    start_urls = [
        "http://www.huxiu.com/index.php"
    ]

    rules = (
        # 提取匹配正则式'/group?f=index_group'链接 (但是不能匹配'deny.php')
        # 并且会递归爬取(如果没有定义callback,默认follow=True).
        Rule(LinkExtractor(allow=('/group?f=index_group', ), deny=('deny\.php', ))),
        # 提取匹配'/article/\d+/\d+.html'的链接,并使用parse_item来解析它们下载后的内容,不递归
        Rule(LinkExtractor(allow=('/article/\d+/\d+\.html', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        detail = response.xpath('//div[@class="article-wrap"]')
        item = HuxiuItem()
        item['title'] = detail.xpath('h1/text()')[0].extract()
        item['link'] = response.url
        item['posttime'] = detail.xpath(
            'div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()
        print(item['title'],item['link'],item['posttime'])
        yield item

详解

 class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

主要参数:
link_extractor是一个Link Extractor对象。 其定义了如何从爬取到的页面提取链接。

callback参数:当link_extractor获取到链接时会调用该参数所指定的回调函数. 该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。
callback参数使用注意:当编写爬虫规则时,请避免使用parse作为回调函数。于CrawlSpider使用parse方法来实现其逻辑,如果您覆盖了parse方法,crawlspider将会运行失败。

cb_kwargs:包含传递给回调函数的参数(keyword argument)的字典。
follow:指定了根据该规则从response提取的链接是否需要继续跟进。当callback为None, 默认值为True。
process_links:主要用来过滤由link_extractor获取到的链接。
process_request:主要用来过滤在rule中提取到的request。

 class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=('a', 'area'), attrs=('href', ), canonicalize=True, unique=True, process_value=None)

主要参数:
allow:满足这个正则表达式(或正则表达式列表)的URL会被提取,如果为空,则全部匹配。
deny:满足这个正则表达式(或正则表达式列表)的URL一定不提取。如果为空,不过滤任何URL。
allow_domains:会被提取的链接的domains(或domains列表)。
deny_domains:一定不会被提取链接的domains(或domains列表)。
deny_extensions: 需要忽略的url扩展名列表,如"bmp", "gif", "jpg", "mp3", "wav", "mp4", "wmv"。默认使用在模块scrapy.linkextractors中定义的IGNORED_EXTENSIONS。
restrict_xpaths:指定提取URL的xpath(或xpath列表)。若不为空,则只使用该参数去提取URL。和allow共同作用过滤链接。
restrict_css:指定提取URL的css列表。若不为空,则只使用该参数去提取URL
tags:指定提取URL的页面tag列表。默认为('a','area')
attrs:从tags参数中指定的tag上提取attrs。默认为('href')
canonicalize:是否标准化每个URL,使用scrapy.utils.url.canonicalize_url。默认为True。
unique:是否过滤提取过的URL
process_value:处理tags和attrs提取到的URL

scrapy shell中测试Link Extractor

scrapy shell "http://blog.csdn.net/u012150179/article/details/11749017"
from scrapy.linkextractors import LinkExtractor
item = LinkExtractor(allow=('/u012150179/article/details')).extract_links(response)

你可能感兴趣的:(scrapy之CrawlSpider)