2016-10-18 149 views
1

我正在使用scrapy runspider命令在同一個域中以相同的結構刮取一組〜10,000個鏈接。隨機在一些頁面之間(大約40%到50%的頁面)被抓取,但沒有被抓取,因爲在我的分析方法中,我評估頁面中的特定元素,基於此我刮掉頁面的其他元素。但是,當它出於某種原因(稍後更多關於此原因)時,對於某些元素而言,該元素的評估不正確。爲了解決這個問題,我想重複調用我的這些url的解析方法,最多5次,直到它正確評估(希望在5次運行中,頁面將正確地響應該條件,否則我假定該元素是真正評估的作爲錯誤)。如何編碼(下面的部分代碼)?Scrapy爬行但不刮刮

上述行爲的可能原因:我的網站鏈接的類型爲 www.example.com/search_term/,它們是在www.example.com中輸入「search_term」後實際動態生成的頁面。所以我的猜測是,在幾種情況下,即使在完全生成www.example.com/search_term/頁面之前,Scrapy也能獲得響應。也許理想的解決方案是使用一個webdriver和所有的,但在這個階段對我來說這些都太複雜了。只要我得到95%的拼搶,我很高興。

下面

相關代碼(消毒的可讀性不留出任何細節):

class mySpider(scrapy.Spider): 
    name = "spidername" 

def start_requests(self): 
    urls = [url1, ... url10000] 

    for url in urls: 
     yield scrapy.Request(url=url, callback=self.parse,headers={ 
      "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3"}) 

def parse(self, response): 
    if (value of particular_item in page == 10): 
    yield {'someitem':  
      response.xpath('/html/body/div').extract())} 
    else: 
    <<Once again call this parse fuction with the same url upto a  maximum of 5 times - Need help in writing the code here>> 

回答

0

你的XPath需要您解析HTML的bodydiv作爲第一要素:

<html> 
    <body> 
     <div>... 

你確定每個網站都是這樣嗎?沒有任何信息什麼你試圖刮我不能給你更多的建議。

或者你可以嘗試另一種解決方案,您從網站上提取所有div S:

for div in response.xpath('//div').extract(): 
    yield {'div': div} 
+0

網站基本上是像搜索各種可能的查詢結果列表: – Scyber

+0

...(抱歉,上面完成查詢)... ...可能的查詢如: www.exapmle.com/abcd/ www.exapmle.com/shjk/ www.exapmle.com/dued/ 因此具有相同的結構。刮取其他60%頁面的成功進一步證明xpaths是正確的。同時也有不同的運行不同的鏈接錯過了,不一定是相同的。所以有時www.exapmle.com/shjk/可能會錯過,有時可能會被刮掉。 – Scyber

+1

在這種情況下,嘗試將「響應」記錄到日誌文件中,以查看您獲得的結果與預期相同。這可能是因爲服務器限制了請求數量,並且您會收到錯誤消息而不是搜索結果。 – GHajba