0
我想在Python的urllib2裏面使用SSH隧道。Python urllib2和SSH代理 - 拋出404找不到
創建隧道:
ssh -N [email protected] -L 1337:localhost:80
- 上面一行應在本地機器上的遠程機器和
port 1337
上使用port 80
。 - 我用
-N
,所以bash提示符(故意)掛起,只要這個隧道正在運行。
Using the tunnel在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()
替換opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
來註銷代理資料,那麼ifconfig.me
頁面會正確下載。 (當然,我工作的項目需要我從幾個不同的網絡訪問文檔,所以我還需要代理的工作。)
Some StackOverflow posts建議使用Requests代替的urllib2。我不介意使用請求 - 我只是在這裏使用urllib2,因爲我不確定如何在請求中執行自定義標頭(例如user-agent
,referer
)。
好的想法。我只是試着用'telnet'的方式,並且還會拋出一個'404'。有關代理可能出錯的任何想法?另外,是否有公共機器可以試用,所以任何StackOverflow用戶都可以重現它? – solvingPuzzles 2013-04-28 17:38:44
@solvingPuzzles您確定在localhost上綁定到端口80的'machine.place.edu'上運行的進程實際上是代理服務器嗎?你有沒有成功地從'place.edu'網絡中使用它?對於來自回送接口的連接,它可能會有不同的表現,因此您可以嘗試使用'ssh -n [email protected] -L 1337:machine.place.edu:80'在不同的接口上打它。 – Aya 2013-04-29 11:35:09
事實證明,問題出在我用'ssh -L'創建的代理上。我不確定爲什麼那個代理不起作用,但是當從一個「免費代理在線」網站使用一個任意的x.x.x.x:80代理時,上面的'Python urllib2'工作正常。 – solvingPuzzles 2013-05-10 04:33:39