请求忽略无效的代理

时间:2016-03-29 16:58:05

标签: python proxy python-requests

我正在学习使用代理来发出请求,但我遇到了一个很大的问题,主要是因为requests并不关心提供的代理是否有效。这使得几乎不可能分辨出某些事情是否真正起作用,而且我真的不知道该怎么做。 requests提供的代理文档非常少。

我的代码从列表中获取用户代理字符串和代理,如下所示:

proxy = {"https": "https://%s:%s@%s" % (USERNAME, PASSWORD, random.choice(PROXY_LIST))}
headers = {"User-Agent": random.choice(USER_AGENT_LIST)}
return partial(requests.get, proxies=proxy, headers=headers)

PROXY_LIST条目的示例:185.46.87.199:8080

问题是我可以更改用户名,更改密码等...... requests似乎没有注意到/关心。发送的所有请求中的很大一部分根本不通过代理。有没有办法测试代理?查看请求是否实际通过提供的代理?实际上任何调试和/或修复它的工具都会非常受欢迎。

经过larsks的建议后,将日志记录级别更改为DEBUG并获得以下输出:

INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): mobile.twitter.com
DEBUG:requests.packages.urllib3.connectionpool:"GET /motivesbylorenr HTTP/1.1" 404 1318

不确定auth是正确还是不正确,并且在调试信息中没有提到代理。同样,请求通过我的本地IP。

1 个答案:

答案 0 :(得分:3)

请求以DEBUG优先级记录调试信息,因此如果通过logging模块启用调试日志记录,则可以看到各种诊断信息。例如:

>>> import logging
>>> logging.basicConfig(level='DEBUG')

有了这个,我可以设置run:

>>> import requests
>>> s = requests.Session()
>>> s.headers={'user-agent': 'my-test-script'}
>>> s.proxies={'http': 'http://localhost:8123',
... 'https': 'http://localhost:8123'}
>>> s.get('http://mentos.com')

见:

INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): localhost
DEBUG:requests.packages.urllib3.connectionpool:"GET http://mentos.com/ HTTP/1.1" 301 0
DEBUG:requests.packages.urllib3.connectionpool:"GET http://us.mentos.com HTTP/1.1" 200 32160
<Response [200]>

这清楚地显示了与代理的连接。

希望足以让你入门。我正在使用Session 在这里,但使用partial的解决方案行为类似。

使用代理requests 时,将上述输出与日志消息进行比较:

>>> requests.get('http://mentos.com')
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): mentos.com
DEBUG:requests.packages.urllib3.connectionpool:"GET / HTTP/1.1" 301 0
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): us.mentos.com
DEBUG:requests.packages.urllib3.connectionpool:"GET / HTTP/1.1" 200 10566
<Response [200]>

在这里,我们看到初始连接是打开到远程站点的 而不是代理,GET请求不包括主机名。

<强>更新

以上,使用HTTPS网址:

>>> response = s.get('https://google.com')
>>> response
<Response [200]>

请注意,我在http词典中设置了httpsproxies个键。