2016-07-26 93 views
0

我想使用scrapy刮刮有一個搜索表單的網站,但它很難做併發請求給出它如何工作: 當您執行搜索時,它創建一個環繞搜索的會話,並且您不能同時進行多次搜索,否則無法再訪問先前搜索的結果。如何刮scrapy中的搜索表格

例如:

啓動帶條件的搜索,它重定向到一個網頁,一個ID和每個結果的細節重用此ID:

list.do?anchor=51edc79.0 
details.do?anchor=51edc79.0.0 
details.do?anchor=51edc79.0.1 

如果我開始一個新的搜索標準B,這是一個新的ID:

list.do?anchor=5200109.0 
details.do?anchor=5200109.0.0 
details.do?anchor=5200109.0.1 

但現在第一搜索的結果也不會顯示內容:

details.do?anchor=51edc79.0.2 => cannot find 
details.do?anchor=51edc79.0.3 => cannot find 

我一次只能做一個請求,以確保第二次搜索不會開始,直到獲取第一次搜索的所有結果,但我仍然想要併發請求以獲得一個結果搜索更快。 所以這個想法將不會開始第二次搜索,直到搜索到所有搜索結果。

你會怎麼做scrapy?

當我允許多個請求(CONCURRENT_REQUESTS)和使用的優先級,第二個搜索開始都是從第一個搜索頁面中之前完成。

感謝

回答

1

通常會議只能靠餅乾,所以你必須使用相同的蜘蛛來管理多個Cookie,並cookiejars are the solution here

只有透過不同的cookiejar每一個搜索請求時,記得要保持傳球與所有相關請求的cookiejar。

爲了控制從蜘蛛開始的餅乾試試這個:

class MySpider(Spider): 
    name = "myspider" 

    number_of_sessions = 5 

    def start_requests(self): 
     for i in range(self.number_of_sessions): 
      yield Request(
       'homepage.com', 
       meta={'cookiejar': i}, 
       dont_filter=True, 
       callback=self.parse, 
      ) 

使用dont_filter參數,因此scrapy不會過濾那些爲重複請求。

+0

感謝您的回覆。我嘗試過,但是我在搜索中看到的ID實際上並不是真正的會話,所以當我使用cookiejar中的新條件開始新搜索時,它會出錯(服務器以500響應,因爲我認爲沒有創建會話服務器)。看起來真正的會話是在訪問主頁時用起始url創建的。所以我必須在主頁上使用cookiejar('Home - > Search - > Result')。這使得它變得複雜起來,因爲我使用主頁作爲獲取標準值的起點,然後纔開始對每個標準進行搜索。 : -/ – Ted

+0

然後你必須控制自爬網開始以來的cookiejars,檢查我更新的答案 – eLRuLL

+0

嗯,也許我錯過了一些東西,但從我的理解,在每個會話中,我仍然有原始問題:在一個會話中,在取得所有結果之前,我不能移動到下一個搜索。我會看看我是否可以用不同的方式使用cookiejar。不管怎麼說,還是要謝謝你。 – Ted