2013-04-27 16 views
0

我想在Python的urllib2裏面使用SSH隧道。Python urllib2和SSH代理 - 拋出404找不到


創建隧道:

ssh -N [email protected] -L 1337:localhost:80 
  • 上面一行應在本地機器上的遠程機器和port 1337上使用port 80
  • 我用-N,所以bash提示符(故意)掛起,只要這個隧道正在運行。

Using the tunnelurllib2

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)。

回答

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相當容易地重新創建。

+0

好的想法。我只是試着用'telnet'的方式,並且還會拋出一個'404'。有關代理可能出錯的任何想法?另外,是否有公共機器可以試用,所以任何StackOverflow用戶都可以重現它? – solvingPuzzles 2013-04-28 17:38:44

+0

@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

+0

事實證明,問題出在我用'ssh -L'創建的代理上。我不確定爲什麼那個代理不起作用,但是當從一個「免費代理在線」網站使用一個任意的x.x.x.x:80代理時,上面的'Python urllib2'工作正常。 – solvingPuzzles 2013-05-10 04:33:39