Python urllib2和SSH代理 - 抛出404未找到

时间:2013-04-27 23:53:14

标签: python ssh proxy urllib2 python-requests

我正在尝试在Python的urllib2中使用SSH隧道。


创建隧道:

ssh -N user@machine.place.edu -L 1337:localhost:80 
  • 以上行应使用远程计算机上的port 80和本地计算机上的port 1337
  • 我使用-N,因此只要此隧道正在运行,bash提示符(故意)就会挂起。

urllib2中的

Using the tunnel

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页面会正确下载。 (当然,我正在处理的项目要求我从几个不同的网络访问文档,所以我仍然需要代理才能工作。)

Some StackOverflow posts建议使用Requests代替urllib2。我不介意使用请求 - 我在这里使用了urllib2,因为我不确定如何在请求中执行自定义标头(例如user-agentreferer)。

1 个答案:

答案 0 :(得分: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轻松地重新创建它。