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

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

 

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

 

07-14 14:26更新:cookie

通過兩個多小時的測試,發現此問題的緣由是 昨天編寫爬蟲程序後,給爬蟲程序添加了下面的屬性:網絡

download_timeout = 20dom

此屬性的解釋:scrapy

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

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

此值默認爲180,由於某網站是國內網站,所以,孤覺得它的文件所有都會下載的很快,不須要180這麼大,因而更改成20,誰知道,其下子域名的robots.txt卻須要這麼久:網站

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

但是,爲何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!~

相關文章
相關標籤/搜索