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爬网站时加代理报错如何解决?


11 回复

你们公司在哪?还招人吗?


在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,
}

常见报错和解决:

  1. ConnectionRefusedError:代理地址/端口不对,或者代理服务没启动
  2. TimeoutError:代理响应太慢,在meta里加超时设置:request.meta['download_timeout'] = 10
  3. 407认证错误:用户名密码格式不对,用上面代码里的base64编码方式

如果还不行,先在命令行测试代理是否有效:

curl -x http://proxy_ip:port http://httpbin.org/ip

代理格式一定要写对,http代理用http://开头,https代理也是http://开头。

总结:检查代理格式和可用性,用中间件最可靠。

网址都 404 了
1n.cn 是啥代理

我故意写错的,是一个动态代理

难道 1n.cn 就是下面那个 w5.t.16yun.cn:6469 么?

又见不格式化的 python 代码,v 站的用户素质已经这样了吗?

建议你看看官方文档,我是 splashrequests
形式如:
SplashRequest ( url, callback, endpoint, args{lua_source…proxy})

你看你用什么 Request 应该大同小异

换个代理,有的不好使

解决了,谢谢!

杀人诛心

回到顶部