我正在学习使用代理来发出请求,但我遇到了一个很大的问题,主要是因为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。
答案 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
词典中设置了https
和proxies
个键。