在网上的哥们上抄的获取代理池,但是一直使用都报告失去响应,以为一直是代理不能用,其实是在我们的middlewares的中间件ProxyMiddleWare的问题(我的版本是python3.7,Scrapy1.5.1)贴出改后的代码
class ProxyMiddleWare(object):
"""docstring for ProxyMiddleWare"""
def process_request(self,request, spider):
'''对request对象加上proxy'''
proxy = self.get_random_proxy()
print("this is request ip:"+proxy)
request.meta['http_proxy'] = proxy
def process_response(self, request, response, spider):
'''对返回的response处理'''
# 如果返回的response状态不是200,重新生成当前request对象
if response.status != 200:
proxy = self.get_random_proxy()
print("this is response ip:"+proxy)
# 对当前reque加上代理
request.meta['http_proxy'] = proxy
return request
return response
def get_random_proxy(self):
'''随机从文件中读取proxy'''
path1=os.path.abspath('.') #表示当前所处的文件夹的绝对路径
while 1:
with open(path1+'\\crawler\\proxies.txt', 'r') as f:
proxies = f.readlines()
if proxies:
break
else:
time.sleep(1)
proxy = random.choice(proxies).strip()
return proxy
重点就在对当前的request加代理这里
request.mata一定是这个样子的
request.meta['http_proxy'] = proxy
原来是request.meta['proxy'] = proxy就会一直有问题,什么主机失去响应啊什么的