1. 程式人生 > >scrapy爬蟲報錯“Temporaty failure in name resolution”

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