2012-01-12 13 views
1

私はPython 2.6.xとurllib2を使っていくつかのWebスクレイピングを行っていますが、各HTTP要求に対して実際には低レベルのソケット情報(実際にはローカルソケットのポート番号)が必要です。誰もそれを得る方法を知っていますか?urllib2から発信ポート番号を取得

おかげ

EDIT:

さて、私はまだ、この権利を取得しようとしているので、私は私が動作するはずと思った何をしたが、私がしようとすると、使用時に、私は出力が届きません新しいもの。私はここで間違って何をしていますか?

from urllib2 import * 

class AbstractHTTPHandler(AbstractHTTPHandler): 

    def do_open(self, http_class, req): 
     """ 
      ...copy docstring... 
     """ 
     print "woot!" 
     ...copy code from urllib2.AbstractHTTPHandler.do_open... 
+0

:代わりに、sockhttp.client文書化されていないプロパティを使用しますが、実際のハンドラを置き換え、そしてだけでなく、独自の新しいものを定義する必要があります。また、あなたのサブクラスの名前を 'AbstractHTTPHandler'と違うように指定し、' from urllib2 import * 'の代わりに' import urllib2'を使うことを強くお勧めします。それ以外の場合は、どのモジュールからどの名前が来るのかはわかりません。 – phihag

+0

私の意図はモジュール全体を完全に取り替えることでしたが、ファイル全体をコピーすることなくそれを行うことはできないようです。すべての助けに感謝します。 – Andy

答えて

3

urllib2は、さまざまなURLスキームで動作することができます。これらのスキームには、ソケットの概念さえない場合もあります。編集に対応して

try: 
    from http.client import HTTPConnection 
except ImportError: # Python<3 
    from httplib import HTTPConnection 

h = HTTPConnection('example.net', 80) 
h.request('GET', '/') 
print('Local port: ' + str(h.sock.getsockname()[1])) 
+0

興味深い。この時点で使用している図書館を交換できるかどうかはわかりませんが、私はそれを調べます。私はまだ 'urllib2.OpenerDirector'オブジェクトからこの情報にアクセスできるようにしたいと思います(HTTPConnectionを使用していて、それをラップすることができますか?)。しかし、私はできないかもしれません。 – Andy

+0

独自のハンドラを作成したい場合は、確実に 'HTTPConnection'オブジェクトを取得できます。これは 'AbstractHTTPHandler.do_open'(およびサブクラス)の最初の引数ですが、どこにも格納されません。 – phihag

+0

ええ、私はそれを見た。私は 'urllib2'の拡張を書いて、私が望むロギングを吐き出すために' AbstractHTTPHandler.do_open'メソッドをオーバーライドすることを考えています。とにかくそれは本当に必要なすべてです。 – Andy

関連する問題