0

我正在尝试在 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)。

4

1 回答 1

1

不幸的是,由于您是唯一可以访问 的人machine.place.edu,因此其他任何人都无法重现该问题。

首先,尝试类似...

$ telnet localhost 1337
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET http://ifconfig.me/ip HTTP/1.0

...并在“GET”行之后按回车键几次,看看你得到了什么。

如果您收到 404,则代理可能有问题。

如果你得到 200,那么你应该可以很容易地用httplib.

于 2013-04-28T08:43:28.070 回答