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 の投稿では、urllib2 の代わりにリクエストを使用することを提案しています。代わりに Requests を使用しても構いません。ここでは urllib2 を使用しました。なぜなら、Requestsでカスタム ヘッダー (たとえばuser-agent
、referer