Python爬虫框架Scrapy爬网站时加代理报错如何解决?
这个网站加了代理报错如下
网址: http://www.csrc.gov.cn/pub/newsite/xxpl/yxpl/index
自己的 middleware 组件
import base64
class proxy_middleware(object):
def init(self):
proxy_host = “t.1n.cn”
proxy_port = “"
self.username = "*”
self.password = “***”
self.proxies = {“https”: “https://{}:{}/”.format(proxy_host, proxy_port)}
self.proxy_server = ‘https://w5.t.16yun.cn:6469’
self.proxy_authorization = 'Basic ’ + base64.urlsafe_b64encode(
bytes((self.username + ‘:’ + self.password), ‘ascii’)).decode(‘utf8’)
def process_request(self, request, spider):
request.meta[‘proxy’] = self.proxy_server
request.headers[‘Proxy-Authorization’] = self.proxy_authorization
2019-01-05 10:37:46 [csrc][scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://www.csrc.gov.cn/pub/newsite/xxpl/yxpl/index_1.html> (failed 1 times): [<twisted.python.failure.Failure OpenSSL.SSL.Error: [(‘SSL routines’, ‘ssl3_get_record’, ‘wrong version number’)]>]
Python爬虫框架Scrapy爬网站时加代理报错如何解决?
你们公司在哪?还招人吗?
在Scrapy里加代理报错,通常是因为代理格式不对或者代理本身失效。直接上代码,最稳的解决方案是用自定义下载器中间件:
# middlewares.py
import base64
class ProxyMiddleware(object):
def process_request(self, request, spider):
# HTTP代理格式
request.meta['proxy'] = 'http://127.0.0.1:8080'
# 如果需要认证(用户名:密码)
# proxy_user_pass = "user:pass"
# encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()
# request.headers['Proxy-Authorization'] = f'Basic {encoded_user_pass}'
然后在settings.py里启用:
DOWNLOADER_MIDDLEWARES = {
'your_project.middlewares.ProxyMiddleware': 100,
}
常见报错和解决:
- ConnectionRefusedError:代理地址/端口不对,或者代理服务没启动
- TimeoutError:代理响应太慢,在meta里加超时设置:
request.meta['download_timeout'] = 10 - 407认证错误:用户名密码格式不对,用上面代码里的base64编码方式
如果还不行,先在命令行测试代理是否有效:
curl -x http://proxy_ip:port http://httpbin.org/ip
代理格式一定要写对,http代理用http://开头,https代理也是http://开头。
总结:检查代理格式和可用性,用中间件最可靠。
网址都 404 了
1n.cn 是啥代理
我故意写错的,是一个动态代理
又见不格式化的 python 代码,v 站的用户素质已经这样了吗?
建议你看看官方文档,我是 splashrequests
形式如:
SplashRequest ( url, callback, endpoint, args{lua_source…proxy})
你看你用什么 Request 应该大同小异
换个代理,有的不好使
解决了,谢谢!
杀人诛心


