使用相同的蜘蛛来解析详细信息页面和分页页面

时间:2017-10-17 16:17:53

标签: scrapy scrapy-spider

我有一个使用链接提取器来移动分页并解析详细信息页面的刮刀,一切正常。示例代码如下:

class SampleSpider(CrawlSpider):
    name = 'sample'
    start_urls = ['https://www.some-pagination-page.com']

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//*[contains(@class, "paging-next")]')),
        Rule(LinkExtractor(restrict_xpaths='//*[contains(@class, "b-button_primary")]'), callback='parse_item'),
    )

    def parse_item(self, response):
      #Code block related to the parsing of item ...
      return item

现在我想使用同一个蜘蛛直接解析详细页面而不分页... 基本上我想用scrapyrt使用这个蜘蛛,我想发送一个参数,表明这是一个详细页面,详细信息页面为start_url, 这样我就可以直接解析该页面并快速返回结果。 在那一刻我解决了重复这个爬虫的问题,并以这种方式删除了规则提取器:

class SampleSpider(scrapy.Spider):
    name = 'sample'
    start_urls = ['https://www.some-details-page.com']

    def parse(self, response):
      #Code block related to the parsing of item ...
      return item

为了避免代码重复,我如何修改蜘蛛,以便它可以与分页start_url和单个详细信息页面一起用作start_url?

是否可以禁用规则? 什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

我不知道这是否是最好的主意,但我这样做是通过重写start_requests并根据蜘蛛参数指定要使用的回调:

class MySpider(CrawlSpider):
    ...

    def start_requests(self):
        if getattr(self, 'url'):
            yield Request(
                url=self.url, 
                callback=getattr(self, getattr('callback', 'parse_item'))
            )
        else:
            for url in self.start_urls:
                yield Request(url)

这样您可以在调用蜘蛛时指定url参数(以及callback方法,默认为parse_item):

scrapy crawl myspider url="http://myurl" callback="parse_item"

如果没有,它将表现为正常CrawlSpider,因为parse方法是Request的默认回调,parse方法是负责的rules方法编译sub compareHashes(%$) { ... }