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!~