我的蜘蛛功能在一個頁面上,我需要去鏈接,並從該頁面獲取一些數據添加到我的項目,但我需要從各種頁面沒有創建更多項目的父頁面。我怎麼會去這樣做,因爲我可以在文檔中讀取我只能以線性的方式去:Python Scrapy,從子頁面返回進行刮取
parent page > next page > next page
但我需要:
parent page > next page
> next page
> next page
我的蜘蛛功能在一個頁面上,我需要去鏈接,並從該頁面獲取一些數據添加到我的項目,但我需要從各種頁面沒有創建更多項目的父頁面。我怎麼會去這樣做,因爲我可以在文檔中讀取我只能以線性的方式去:Python Scrapy,從子頁面返回進行刮取
parent page > next page > next page
但我需要:
parent page > next page
> next page
> next page
您應該返回Request
實例和通過item
左右meta
。而且你必須以線性方式創建並建立一系列請求和回調。爲了實現它,你可以繞過請求的列表來完成一個項目,從上次回調返回一個項目:
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 Requests您可以對scrapy.Request
的回調中的下一個URL執行額外的操作。
謝謝,這種結構將不得不工作。 *裂縫knucles *,我猜它與scrapy使用的反應堆有關? – Barfe
@Barfe是的,這是由於scrapy的異步性質。您無法預測哪個請求會在另一個請求之前完成,或換句話說,您無法知道哪個回調會返回一個項目。 – alecxe
@Barfe也可以看看[這個答案](http://stackoverflow.com/a/25571270/771848) - 它正是關於你的用例。這與我提出的想法基本相同,但是以更優雅的方式。 – alecxe