使用同一个蜘蛛解析详情页和分页

Use the same spider to parse details page and pagination page

我有一个使用 link 提取器移动分页并解析详细信息页面的抓取工具,一切正常。示例代码如下:

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, 这样我就可以直接解析该页面并快速 return 结果。 目前我已经解决了复制这个爬虫并只删除规则提取器的问题,方法是:

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 ?

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

我不知道这是否是最好的主意,但我通过重写 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 方法是 Requests 的默认回调,而 parse 方法是负责编译 rules.