我正在尝试在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
。
可能出现什么问题,我们该如何解决?
故障排除:
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-agent
,referer
)。
答案 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
轻松地重新创建它。