2015-10-14 87 views
0

簡介 你好,我使用Scrapy爲了在雅虎答案採取數據。 我的成就是將所有問題和答案都放在一個精確的部分。在Scrapy中使用遞歸蜘蛛[Python]

我嘗試 使用scrapy和硒首先我嘗試採取在部分任何問題的列表,這個列表是記憶中的蜘蛛類。 我使用For循環來解析每一頁。

for url in self.start_urls_mod: 
     yield scrapy.Request(url, callback=self.parse_page) 
     i = i + 1 

該方法parse_page的結構爲廢棄問題頁面,最佳答案和所有其他答案。 這工作正常。

問題當我嘗試在頁面右側的下一個鏈接中出現的「下一步」鏈接中使用href繼續「下一步」問題時出現。 我再次調用相同的函數parse_page,從該鏈接傳遞URL。 有時這項工作,但其他時間沒有。 我現在不調用parse_page函數兩次是正確的,沒有在其他地方使用任何基本情況來停止遞歸它的停止。

該程序工作沒有任何錯誤,並停止,但我沒有找到任何問題在「下一節」部分。只有一個人。

有我的代碼片段。

def parse_page(self, response): 
    #Scraping with xpath things that interests me 
    #Go to the next similar question 
    next_page = hxs.xpath('((//a[contains(@class,"Clr-b")])[3])/@href').extract() 
    composed_string = "https://answers.yahoo.com" + next_page[0] 
    print("NEXT -> "+str(composed_string)) 
    yield scrapy.Request(urljoin(response.url, composed_string), callback=self.parse_page) 

ps。我會用一個叫做蜘蛛的蜘蛛,但是我不能定義任何規則來採取這種類型的問題。所以請如何改善我的功能。

相關信息: 所有的XPath選擇下URL的https://answers.yahoo.com/question/index?qid=20151008101821AAuHgCk

回答

1

首先是錯誤的。您將始終獲得第三個帶有「Clr-b」的URL,這可能是錯誤的(它不存在或不是下一個站點)。

對於這樣的查詢,我會使用文本搜索。你的情況是這樣的:

next_page = response.xpath('//a[contains(@class,"Clr-b") and text()=" Next "]/@href').extract() 

然後您撰寫您的網址,你做的,你不必使用urljoin。這不是必須的,因爲您已經擁有了正確的網址,您需要按照yield這樣的網址。這可能是您的蜘蛛停止的原因:您生成了一個沒有找到的urljoin的URL - 這不是您打印到控制檯的URL。

使用與回調相同的函數沒有問題。

+0

謝謝你,所以這將是正確的收益? yield scrapy.Request(composed_string,callback = self.parse_page) – RedVelvet

+1

不客氣。是的,那將是正確的收益率。 – GHajba

+0

非常感謝,我嘗試了一下這個建議!我讓你知道! – RedVelvet