Scrapy的301、302重定向問題原因及解決辦法


Scrapy的301、302重定向問題原因及解決辦法

根據 HTTP標准 ,返回值為200-300之間的值為成功的response。

Scrapy運行爬蟲過程中,目標網站返回301或302,而沒有獲取到想要的網頁內容,表示請求失敗。eg:

2019-02-13 17:18:32 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 2019-02-13 17:18:33 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET http://www.baidu.com/search/?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6> from <GET https://zhidao.baidu.com/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6> 2019-02-13 17:18:36 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://www.baidu.com/forbiddenip/forbidden.html> from <GET http://www.baidu.com/search/?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6> 2019-02-13 17:18:40 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.baidu.com/forbiddenip/forbidden.html> (referer: None) 2019-02-13 17:18:41 [scrapy.core.engine] INFO: Closing spider (finished) 2019-02-13 17:18:41 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 2295, 

301、302

301 :(永久重定向) 被請求的資源已永久移動到新位置

302:(暫時的重定向)

兩個都屬於重定向的問題,原因和解決辦法差不多,通常是由原因1或原因2導致的。

原因1:網址發生改變,而我們還用舊網址去訪問。

參考:https://www.cnblogs.com/haitianzhimen/p/8618251.html

比如,我們訪問 http😕/www.baidu.com 會跳轉到 https😕/www.baidu.com,發送請求之后,就會返回301狀態碼,然后返回一個location,提示新的地址,瀏覽器就會拿着這個新的地址去訪問。

解決辦法:根據重定向的網址(即新的網址)來請求

原因2:爬蟲偽裝的不夠好,被服務器識別出是爬蟲。

參考:https://www.cnblogs.com/zhengdongdong/p/10876523.html

解決辦法:添加User-Agent,Cookie等偽裝手段,可以在瀏覽器中輸入about:version查看User-Agent,Cookie。

如何偽裝爬蟲:https://zhidao.baidu.com/question/814573192067571772.html

原因3:在REQUEST_HEADERS指定了Host。

參考:https://www.jianshu.com/p/001d6aa123cb

解決辦法:注釋或刪除相關設置

“錯誤”的解決辦法:

“錯誤”不是指真正的錯誤,而是指大概率不管用,但也值得一試。

方式1:在請求時添加handle_httpstatus_list,eg:

    def start_requests(self): for i in self.start_urls: yield scrapy.Request(url=i, meta={ 'dont_redirect': True, # 這個可以 'handle_httpstatus_list': [301, 302] # 這個不行 }, callback=self.parse) 

這個等於掩耳盜鈴,不能真正解決問題

方式2:在yield里面加上dont_filter=True

yield scrapy.Request(url=listUrl[i],callback=self.get_content,meta={'item':item},method='GET',dont_filter=True) 

部分帖子說在yield里面加上dont_filter=True,能解決這個問題,但實際上不是所有問題都能解決。dont_filter是對出現問題的url將會再次被傳遞,只是代表多試幾次,若是像原因1這樣的,無論請求多少次,都是301.

方式3:在settings中添加HTTPERROR_ALLOWED_CODES,eg:

HTTPERROR_ALLOWED_CODES = [302]

這個表示允許302的錯誤而不處理。

這幾種方式可能對你有用,因為不同的環境原因不同,我之所以將其歸到“錯誤”,是因為我曾經遇到了一個301問題,因為我用了舊的http://,而新的為https://,試過了上面幾種方式都不能解決。

也因為如此,將這些可能的原因及解決辦法匯總,供后來者參考。

 

  轉載於:CSDN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM