Scrapy項目之User timeout caused connection failure(異常記錄)


Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0,

 

提示:此文存在問題,真正測試, 請勿閱讀,

 

07-14 14:26更新:

經過兩個多小時的測試,發現此問題的原因是 昨天編寫爬蟲程序后,給爬蟲程序添加了下面的屬性:

download_timeout = 20

此屬性的解釋:

The amount of time (in secs) that the downloader will wait before timing out.

在獲取某網站的子域名的robots.txt文件時,需要的時間遠遠超過20秒,因此,即便有三次重試的機會,也會最終失敗。

此值默認為180,因為某網站是國內網站,因此,孤以為它的文件全部都會下載的很快,不需要180這么大,於是更改為20,誰知道,其下子域名的robots.txt卻需要這么久:

測試期間更改為30時,狀況好了,目前已取消設置此值,已能抓取到需要的數據。

可是,為什么robots.txt會下載這么慢呢?

 

刪除Request中定義的errback進行測試,也可以獲取到需要的數據。

那么,在Request中定義errback有什么用呢?

 

現在,再次在項目內、項目外執行下面的命令都不會發生DNSLookupError了(測試過)(可是,上午怎么就發生了呢?):

scrapy shell "http://money.163.com/18/0714/03/DML7R3EO002580S6.html"

 

--------可以忽略后面部分--------

 

昨日寫了一個爬蟲程序,用來抓取新聞數據,但在抓取某網站數據時發生了錯誤:超時、重試……開始是超過默認等待180秒的時間,后來自己在爬蟲程序中改為了20秒,所以下圖顯示為20 seconds。

 

完全不知道怎么回事!上面是使用Scrapy項目內的基於CrawlerRunner編寫的程序運行的,看不到更多數據!

嘗試將爬蟲中的allowed_domains改為下面兩種形式(最后會使用第二種)進行測試——以為和子域名有關系仍然失敗。

1 #allowed_domains = ['www.163.com', 'money.163.com', 'mobile.163.com',
2 #                   'news.163.com', 'tech.163.com']
3 
4 allowed_domains = ['163.com']

 

后來又在settings.py中關閉了robots.txt協議、開啟了Cookies支持:仍然失敗。

1 # Obey robots.txt rules
2 ROBOTSTXT_OBEY = False
3 
4 # Disable cookies (enabled by default)
5 COOKIES_ENABLED = True

 

此時,依靠着之前的知識儲備是無法解決問題的了!

 

使用scrapy shell對獲取超時的網頁進行測試,結果得到了twisted.internet.error.DNSLookupError的異常信息:

scrapy shell "http://money.163.com/18/0714/03/DML7R3EO002580S6.html"

 

但是,使用ping命令卻可以得到上面失敗的子域名的IP地址:

 

twisted作為一個很常用的Python庫,怎么會發生這樣的問題呢!完全不應該的!

 

求助網絡吧!最終找到下面的文章:

How do I catch errors with scrapy so I can do something when I get User Timeout error?

 

最佳答案!中文什么意思:在Request實例中定義errback!請讀三遍

 

這么簡單?和處理DNSLookupError錯誤有什么關系呢?為何定義了回調函數就可以了呢?

沒想明白,不行動……

繼續搜索,沒有更多了……

 

好吧,試試這個方法,更改某網站的爬蟲程序如下:

增加了errback = self.errback_163,其中,回調函數errback_163的寫法和上面的參考文章中的一致(后來發現其來自Scrapy官文Requests and Responses中)。

1 yield response.follow(item, callback = self.parse_a_new,
2                                   errback = self.errback_163)

 

准備就緒,使用scapy crawl測試最新程序(在將之前修改的配置還原后——遵守robots.txt協議、禁止Cookies、allowed_domains設置為163.com):成功抓取了想要的數據!

 

好了,問題解決了。可是,之前的疑問還是沒有解決~后續再dig吧!~“神奇的”errback!~

 


免責聲明!

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



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