scrapy爬蟲報錯“Temporaty failure in name resolution”
原因不明,根據一個帖子,進行了如下修改後,仍未解決該問題:
$ vim /etc/resolv.conf
然後修改檔案中的nameserver
該方法無效。
後連線vpn後再次執行該爬蟲,就不報這個錯誤了。
而是報錯:
$ apt-get update
$ apt-get install openssl
現在報錯內容不再是改錯誤了,不知道是否徹底解決,後期會繼續更新。
2016.12.21
=====================================================================
執行後,報錯 crawled (404),該錯誤的生成應該是爬蟲被網站ban掉了。
在網路上查找了一些解決方法,最後參考如何讓你的爬蟲不再被ban,對程式添加了middlewares.py。
在scrapy爬蟲中,僅修改settings.py中的DELAY、PROXY、USER_AGENT是不行的,需要通過middlewares.py來管理這些變數。
故將帖子中的中介軟體檔案新增在專案中,檔案內容如下:
[root@bogon cnblogs]# vi cnblogs/middlewares.py import random import base64 from settings import PROXIES class RandomUserAgent(object): """Randomly rotate user agents based on a list of predefined ones""" def __init__(self, agents): self.agents = agents @classmethod def from_crawler(cls, crawler): return cls(crawler.settings.getlist('USER_AGENTS')) def process_request(self, request, spider): #print "**************************" + random.choice(self.agents) request.headers.setdefault('User-Agent', random.choice(self.agents)) class ProxyMiddleware(object): def process_request(self, request, spider): proxy = random.choice(PROXIES) if proxy['user_pass'] is not None: request.meta['proxy'] = "http://%s" % proxy['ip_port'] encoded_user_pass = base64.encodestring(proxy['user_pass']) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass print "**************ProxyMiddleware have pass************" + proxy['ip_port'] else: print "**************ProxyMiddleware no pass************" + proxy['ip_port'] request.meta['proxy'] = "http://%s" % proxy['ip_port']
根據參考帖子中的內容新增middlewares.py檔案後,執行時報錯:
File "/usr/lib/python2.7/random.py",line 273, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
IndexError: list index out of range
進入該錯誤指明的檔案中,choice函式的引數(seq)為空時就會報此錯。
退回至自己middlewares.py檔案中檢視,在16行和20行使用了choice方法。而,20行中,choice方法的引數,是在檔案頭引入的settings檔案中的PROXIES列表,並不為空,所以錯誤應該發生在16行。
16行中,choice方法的引數是在類初始化時定義的,而在語句:
self.agents = agents
中,agents是未被定義的,所以是空。16行的目的,是在我們的USER_AGENT中隨機選擇,所以我們在頭部的模組引用中,新增:
from settings import USER_AGENT
並將類初始化中的語句改為:
self.agents = USER_AGENT
20161622
=====================================================================================
根據如上修改後,新增的中介軟體可以正常工作了。但是,爬蟲仍舊不能成功連結網站進行內容抓取。希望不是因為這個網站的反爬蟲技術太牛逼。。。2333333
不能爬取的資訊顯示: Connection was refused by other side: 111: Connection refused