【问题标题】:Python Scrapy, return from child page to carry on scrapingPython Scrapy,从子页面返回进行抓取
【发布时间】:2014-11-16 22:46:22
【问题描述】:

我的蜘蛛功能在一个页面上,我需要转到一个链接并从该页面获取一些数据以添加到我的项目中,但我需要从父页面转到各个页面而不创建更多项目。我将如何去做,因为从我在文档中可以阅读的内容来看,我只能以线性方式进行:

  parent page > next page > next page

但我需要:

  parent page > next page
              > next page
              > next page

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    您应该返回Request 实例并在meta 中传递item。而且您必须以线性方式实现并构建请求和回调链。为了实现它,您可以传递完成项目的请求列表并从最后一个回调中返回一个项目:

    def parse_main_page(self, response):
        item = MyItem()
        item['main_url'] = response.url
    
        url1 = response.xpath('//a[@class="link1"]/@href').extract()[0]
        request1 = scrapy.Request(url1, callback=self.parse_page1)
    
        url2 = response.xpath('//a[@class="link2"]/@href').extract()[0]
        request2 = scrapy.Request(url2, callback=self.parse_page2)
    
        url3 = response.xpath('//a[@class="link3"]/@href').extract()[0]
        request3 = scrapy.Request(url3, callback=self.parse_page3)
    
        request.meta['item'] = item
        request.meta['requests'] = [request2, request3]
        return request1
    
    def parse_page1(self, response):
        item = response.meta['item']
        item['data1'] = response.xpath('//div[@class="data1"]/text()').extract()[0]
    
        return request.meta['requests'].pop(0)
    
    def parse_page2(self, response):
        item = response.meta['item']
        item['data2'] = response.xpath('//div[@class="data2"]/text()').extract()[0]
    
        return request.meta['requests'].pop(0)
    
    def parse_page3(self, response):
        item = response.meta['item']
        item['data3'] = response.xpath('//div[@class="data3"]/text()').extract()[0]
    
        return item
    

    另见:

    【讨论】:

    • 谢谢,这个结构必须工作。 开裂指节,我猜是和scrapy用的Reactor有关吧?
    • @Barfe 是的,这是由于scrapy 的异步特性。您无法预测哪个请求会在另一个请求之前完成,或者换句话说,您无法知道从哪个回调中返回一个项目。
    • @Barfe 也可以查看this answer - 这正是您的用例。这与我提出的想法基本相同,但采用了更优雅的方式。
    【解决方案2】:

    使用Scrapy Requests,您可以在scrapy.Request 的回调中对下一个URL 执行额外的操作。

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多