我想我发现使用HTTPS时请求库的重定向处理存在问题。据我所知,这只是服务器将请求客户端重定向到另一个HTTPS资源时的问题。
我可以向您保证,我正在使用的代理支持HTTPS和CONNECT方法,因为我可以将其与浏览器一起使用。我使用的是Requests库的2.1.0版本,而它使用的是urllib3库的1.7.1。
我看到在Wireshark的交易,我可以看到第一个交易https://www.paypal.com/,但我没有看到任何东西https://www.paypal.com/home。当使用调试器调试堆栈中的任何更深层内容时,我总是会超时,因此我不知道从这里开始。由于重定向,我绝对看不到对/ home的请求。因此,在将其发送到代理之前,它必须在代码中出错。
我想知道这是否真的是一个错误或我做错了什么。只要您可以访问可通过其发送流量的代理,它的复制就非常容易。请参见下面的代码:
import requests
proxiesDict = {
'http': "http://127.0.0.1:8080",
'https': "http://127.0.0.1:8080"
}
# This fails with "requests.exceptions.ProxyError: Cannot connect to proxy. Socket error: [Errno 111] Connection refused." when it tries to follow the redirect to /home
r = requests.get("https://www.paypal.com/", proxies=proxiesDict)
# This succeeds.
r = requests.get("https://www.paypal.com/home", proxies=proxiesDict)
直接使用urllib3时也会发生这种情况。这可能主要是urllib3中的一个错误,Requests在后台使用它,但是我使用的是更高级别的请求库。见下文:
proxy = urllib3.proxy_from_url('http://127.0.0.1:8080/')
# This fails with the same error as above.
res = proxy.urlopen('GET', https://www.paypal.com/)
# This succeeds
res = proxy.urlopen('GET', https://www.paypal.com/home)
这是使用请求时的回溯:
Traceback (most recent call last):
File "tests/downloader_tests.py", line 22, in test_proxy_https_request
r = requests.get("https://www.paypal.com/", proxies=proxiesDict)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 382, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 505, in send
history = [resp for resp in gen] if allow_redirects else []
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 167, in resolve_redirects
allow_redirects=False,
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 485, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 375, in send
raise ProxyError(e)
requests.exceptions.ProxyError: Cannot connect to proxy. Socket error: [Errno 111] Connection refused.
更新:
仅使用302(找到)重定向而不是使用常规301重定向(永久移动),才可能出现此问题。另外,我注意到在Chrome浏览器中,Paypal不会返回重定向。我确实在使用请求时看到了重定向-即使我为此实验借用了Chrome的用户代理。我正在寻找更多返回302的URL,以获取更多数据点。
我需要使用它来处理所有URL,或者至少了解为什么我会看到这种行为。
这是urllib3中的错误。我们将其作为urllib3问题#295进行跟踪。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句