返回介绍

13.2 使用多个代理

发布于 2024-02-05 21:13:20 字数 1799 浏览 0 评论 0 收藏 0

利用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文