2017-01-06 28 views
0

我剛剛開始使用Scrapy,並且閱讀了教程,但是我遇到了一個問題,無論是在教程和/或文檔中找不到答案,或者我已閱讀答案多次了,但我只是不理解正確...Scrapy - 基於HTTP狀態碼動態構建URL?

場景:

比方說,我有整整1個網站,我想抓取。內容是基於url中傳遞的查詢參數動態呈現的。我將需要根據「類別」的URL pram搜索3套「數據」。

我需要可以從公共基本的URL來抓住這樣的所有信息:

http://shop.somesite.com/browse/?product_type=instruments

而且每種類別的網址,像這樣:

http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums

http://shop.somesite.com/browse/?q=&product_type=instruments&category=keyboards

http://shop.somesite.com/browse/?q=&product_type=instruments&category=guitars

這裏需要注意的一點是,該網站每次初始請求只加載30個結果。如果用戶想要查看更多,他們必須點擊底部的按鈕「加載更多結果...」。在調查了這一點之後,在初始加載頁面時,只有對前30的請求被做出(這是有道理的),並且在點擊「加載更多..」按鈕後,URL被更新爲「pagex = 2」容器刷新了30多個結果。之後,該按鈕消失,當用戶繼續向下滾動頁面時,後續請求會發送到服務器以獲取下一個30個結果,「pagex」值將增加1,容器刷新並添加結果,漂洗並重復。

我並不確定如何處理網站分頁,但我想出的最簡單的解決方案是簡單地找出每個類別的最大數字「pagex」是什麼,只需將網址設置爲初始值即可。

例如,如果你在瀏覽器中通過URL:

http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums&pagex=22

HTTP響應代碼200,收到所有結果呈現給頁面。大!這給了我我需要的東西!

但是,說下週左右,增加了50個項目,所以現在的最大值是「... pagex = 24」我不會得到最新的。

或者刪除了50個項目,新的最大值是「... pagex = 20」,當請求「22」時我將得到404響應。

我想發送一個測試響應,其中包含上次已知的「最佳」最大頁面數,並基於提供的HTTP響應,使用該響應來決定將要使用的URL。因此,在我開始任何爬行之前,我想給「pagex」加1,並檢查404。如果404我知道我還好,如果我得到200,我需要繼續加1,直到我得到404,所以我知道max是多少(或者如果需要的話減少)。

我似乎無法弄清楚,如果我可以使用Scrapy來做到這一點,我必須先使用不同的模塊來運行此檢查。我嘗試在「parse」和「start_requests」方法中添加簡單的檢查用於測試目的,並且沒有運氣。start_requests似乎無法處理響應,解析可檢查響應代碼,但不會按照指示更新URL。

我敢肯定,這是我糟糕的編碼能力(仍然新的這一切),但我似乎無法找到一個可行的解決方案....

任何想法或意見都非常感謝!

回答

0

您可以在scrapy中配置要配置哪些狀態,這樣您可以根據response.statusparse方法中做出決定。檢查如何處理the documentation中的狀態。例如:

class MySpider(CrawlSpider): 
    handle_httpstatus_list = [404] 
+0

感謝您的迴應,併爲延誤感到抱歉!我暫時放棄了我在網站爬行方面的一些小實驗,以開展其他項目。我會在今晚在這裏測試你的建議,如果確實能解決這個問題,請將其標記爲答案。我很好奇你是否可以在整體上提供你對我的「策略」的看法。鑑於我期望做什麼以及面臨的具體挑戰,你會認爲這是克服這個問題的可接受的方式,或者你會提出一種不同的方法嗎? –