2015-10-14 54 views
1

我使用Scrapy和我有關設置「CONCURRENT_REQUESTS」的文檔閱讀。 他談論「Scrapy下載器將執行的併發(即同時)請求的最大數量。」信息對Scrapy CONCURRENT_REQUESTS在Python

我創建了一個蜘蛛,以便從Q & A網站獲得問題和答案,所以我想知道是否可以運行多個併發請求。 現在我已將此值設置爲1,因爲我不想放棄某個項目或重寫某個人。 的主要疑問是,我有一個全局ID idQuestion(用於製作idQuestion.idAnswer)用於任何項目做我不知道,如果讓多個請求都可以是一個爛攤子,寬鬆一些項目o設置爲錯誤的ID。

這是一個代碼片段:

class Scraper(scrapy.Spider): 
    uid = 1 


    def parse_page(self, response): 
     # Scraping a single question 

     item = ScrapeItem() 
     hxs = HtmlXPathSelector(response) 
     #item['date_time'] = response.meta['data'] 
     item['type'] = "Question" 
     item['uid'] = str(self.uid) 
     item['url'] = response.url 

     #Do some scraping. 
     ans_uid = ans_uid + 1 
     item['uid'] = str(str(self.uid) + (":" + str(ans_uid))) 
     yield item 

     #Call recusivly the method on other page. 
     print("NEXT -> "+str(composed_string)) 
     yield scrapy.Request(composed_string, callback=self.parse_page) 

這是我的代碼骨架。 我使用uid記住單個問題的id和答案的ans_uid。 例:

1)問題

1.1)答1問題1

1.2)答2問題1

1.3)答3問題1

**可我只是增加CONCURRENT_REQUESTS值?沒有妥協的東西? **

+0

'ans_uid'未初始化 – eLRuLL

回答

1

回答你的問題是:沒有。如果增加併發請求,則最終可能得到uid的不同值 - 即使稍後問題相同。這是因爲不能保證您的請求按順序處理。

但是你可以通過沿着你Request對象與meta屬性信息。我想隨着yield Request(...作爲meta標籤ID傳遞,然後看在parse_page如果此屬性是否可用。如果不是,那麼這是一個新問題,如果是的話,使用這個ID,因爲這不是一個新問題。

你可以閱讀更多關於meta這裏:http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request.meta

0

Scrapy是不是多線程環境,而是採用了事件循環驅動的異步架構(扭曲,這是有點像的node.js的python)。

在這個意義上,它完全是線程安全的。

實際上,您具有對請求對象的引用,作爲response - > response.request,它具有response.request.url,以及發送referer頭和response.request.meta,因此您可以從答案回到內置的問題(如類似的引用標題),如果您從單個頁面的問題或答案列表中閱讀,則可以保證這些問題和答案將按順序閱讀。

你可以做類似如下:

class mySpider(Spider): 
    def parse_answer(self, response): 
     question_url = response.request.headers.get('Referer', None) 
     yield Answer(question_url = ..., answerinfo = ...) 

class Answer(item): 
    answer = .... 
    question_url = ... 

希望有所幫助。