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