Python Scrapy,从子页面返回进行抓取

时间:2014-11-16 22:46:22

标签: python web-scraping scrapy

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

  parent page > next page > next page

但我需要:

  parent page > next page
              > next page
              > next page

2 个答案:

答案 0 :(得分:3)

您应该返回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

另见:

答案 1 :(得分:1)

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