我正在尝试在 Python 的 urllib2 中使用 SSH 隧道。
创建隧道:
ssh -N user@machine.place.edu -L 1337:localhost:80
- 上面的行应该
port 80
在远程机器和port 1337
本地机器上使用。 - 我使用
-N
了,所以只要这条隧道正在运行,bash 提示符(故意)就会挂起。
使用隧道urllib2
:
import urllib2
url = "http://ifconfig.me/ip"
headers={'User-agent' : 'Mozilla/5.0'}
proxy_support = urllib2.ProxyHandler({'http': 'http://127.0.0.1:1337'})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)
req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
print html
当我运行上面的代码时,html = urllib2.urlopen(req).read()
抛出错误urllib2.HTTPError: HTTP Error 404: Not Found
。
可能出了什么问题,我们该如何解决?
故障排除:
- 如果我关闭 SSH 隧道,错误将变为
urllib2.URLError: <urlopen error [Errno 61] Connection refused>
. 因此,Python 显然“看到”了 SSH 隧道。 opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
如果我通过替换为注释掉代理内容opener = urllib2.build_opener()
,则ifconfig.me
页面会正确下载。(当然,我正在进行的项目需要我从几个不同的网络访问文档,所以我仍然需要代理才能工作。)
一些 StackOverflow 帖子建议使用Requests而不是 urllib2。我不介意使用 Requests ——我只是在这里使用 urllib2 因为我不确定如何在 Requests 中执行自定义标头(例如user-agent
, referer
)。