文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
13.2 使用多个代理
利用HttpProxyMiddleware为爬虫设置代理时,对于一种协议(HTTP或HTTPS)的所有请求只能使用一个代理,如果想使用多个代理,可以在构造每一个Request对象时,通过meta参数的proxy字段手动设置代理:
request1 = Request('http://example.com/1', meta={'proxy': 'http://166.1.34.21:7117'}) request2 = Request('http://example.com/2', meta={'proxy': 'http://177.2.35.21:8118'}) request3 = Request('http://example.com/3', meta={'proxy': 'http://188.3.36.21:9119'})
按照与之前相同的做法,在scrapy shell进行实验,验证代理是否被使用:
$ scrapy shell ... >>> from scrapy import Request >>> req = Request('http://httpbin.org/ip', meta={'proxy': 'http://116.29.35.201:8118'}) >>> fetch(req) [scrapy] DEBUG: Crawled (200) (referer: None) >>> json.loads(response.text) {'origin': '116.29.35.201'} >>> req = Request('https://httpbin.org/ip', meta={'proxy': 'http://197.10.171.143:8118'}) >>> fetch(req) [scrapy] DEBUG: Crawled (200) (referer: None) >>> json.loads(response.text) {'origin': '197.10.171.143'}
结果表明,Scrapy爬虫同样使用了指定的代理服务器。
使用手动方式设置代理时,如果使用的代理需要身份验证,还需要通过HTTP头部的Proxy-Authorization字段传递包含用户账号和密码的身份验证信息。可以参考HttpProxyMiddleware._get_proxy中的相关实现,按以下过程生成身份验证信息:
(1)将账号、密码拼接成形如'user:passwd'的字符串s1。
(2)按代理服务器要求对s1进行编码(如utf8),生成s2。
(3)再对s2进行Base64编码,生成s3。
(4)将s3拼接到固定字节串b'Basic '后面,得到最终的身份验证信息。
示例代码如下:
>>> from scrapy import Request >>> import base64 >>> req = Request('http://httpbin.org/ip', meta={'proxy': 'http://116.29.35.201:8118'}) >>> user = 'liushuo' >>> passwd = '12345678' >>> user_passwd = ('%s:%s' % (user, passwd)).encode('utf8') >>> user_passwd b'liushuo:12345678' >>> req.headers['Proxy-Authorization'] = b'Basic ' + base64.b64encode(user_passwd) >>> fetch(req) ...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论