原因不明,根据一个帖子,进行了如下修改后,仍未解决该问题:
$ vim /etc/resolv.conf
然后修改文件中的nameserver
该方法无效。
后连接vpn后再次运行该爬虫,就不报这个错误了。
而是报错:
参考了twisted.python.failure , 在命令窗口中运行了如下命令,以更新ssl:
$ 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
=====================================================================================
根据如上修改后,添加的中间件可以正常工作了。但是,爬虫仍旧不能成功链接网站进行内容抓取。希望不是因为这个网站的反爬虫技术太牛逼。。。2333333
不能爬取的信息显示: Connection was refused by other side: 111: Connection refused