2017-06-13 86 views
0

我正在編寫一個scrapy爬蟲,用於迭代'下一頁'爬行。 我的代碼是這樣的:Scrapy意外跳過了一些頁面

def parse(self, response): 

    while self.current_page<=self.total_page: 

     self.current_page = int(self.selector.css("something").extract()[-1]) 

     for post_node in self.selector.css("div.info-column"): 
      yield { 
       "location": post_node.css("something").extract(), 
      } 
     logging.info("************** now page is %d **************", self.current_page) 
     logging.info("********** one page done,Going to next **********") 

     try: 

      self.next.send_keys('\n') 

我預想的代碼抓取每一頁的信息,然後點擊下一頁。但打印的調試信息顯示它經常跳過一些頁面。

可能是什麼原因?

回答

0

(道歉....我不能發表對您的問題的意見,因爲我沒有足夠的代表) 請張貼更多您的代碼...或日誌本身。根據配置有很多不同點我們需要更多的信息來診斷。有太多的其他代碼可能在這裏互動不佳。

當您的logging.info語句執行時,self.current_page肯定會陳舊/誤導。自我就是蜘蛛對象。如果任何其他代碼生成由parse()處理的鏈接,那麼當執行日誌語句時,current_page將被過時/重新分配。

我注意到您的打印效果是在產量之後: 產量暫停函數並在您嘗試再次迭代之後從該位置恢復。也許你被誤導是因爲你的logging.info發生的方式與頁面的實際處理分開。

scrapy下載隊列是LIFO(後進先出)。所以它會在返回嘗試迭代'first'parse()調用之前處理「新」東西。

我也猜測你正在嘗試在發送'\ n'的頁面下加載一個新的「頁面」的AJAXy網頁上運行?

什麼可以發生的是,你首先加載頁面,設置CURRENT_PAGE,你得到新的項目,新項目處理,新的鏈接被其他規則或機制養殖未顯示,解析被稱爲這些鏈接,CURRENT_PAGE設置到那些新的頁碼......一堆其他的東西......,最後你的原始parse()調用被請求它的下一個項目,它從yield語句中恢復並且記錄「現在頁面是%d」,並且出現錯誤的current_page編號。

我的答案可能是假設事情不一定是真的,因爲缺乏信息......但至少如果給你東西咀嚼。

+0

感謝您的幫助。經過幾個小時的調試。當我切換到xpath定位器時,我終於可以工作了。當我閱讀他們對selector.css函數的評論時。有人說,CSS選擇器是翻譯成xpath。我不確定是否由於css選擇器的穩定性。但是xpath對我來說一直穩定運行。 – Jimmy