代码之家  ›  专栏  ›  技术社区  ›  aleroot

使用相同的爬行器分析详细信息页面和分页页面

  •  0
  • aleroot  · 技术社区  · 8 年前

    我有一个刮刀,使用链接提取器通过分页和解析详细页面,一切都很好。示例代码如下:

    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\u 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
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   eLRuLL    8 年前

    我不知道这是否是最好的主意,但我正在通过重写 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 调用spider时的参数(以及 callback 方法,默认为 parse_item ):

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

    CrawlSpider 因为 parse 方法是的默认回调 Request s和 作语法分析 方法是负责编译 rules .