2012-01-12 61 views
1

我正在使用Python 2.6.x和urllib2來做一些網頁抓取,但是我需要真正的底層套接字信息(實際上就是本地套接字的端口號)。有誰知道如何得到那個?從urllib2獲取傳出端口號

感謝

編輯:

好吧,我仍然試圖得到這個權利,所以我做了我認爲應該工作,但我沒有收到輸出,當我嘗試和使用新的東西。我在這裏做錯了什麼?

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

爲響應編輯:你實際上必須更換處理,而不是隻定義自己的新的。另外,我強烈建議用不同的方式命名你的子類,然後使用'AbstractHTTPHandler',並使用'import urllib2'而不是'urllib2 import *'。否則,將不清楚哪個名稱來自哪個模塊。 – phihag 2012-01-12 14:35:27

+0

我的意圖是能夠完全更換模塊,但看起來我無法複製整個文件。感謝所有的幫助。 – Andy 2012-01-12 15:37:23

回答

3

urllib2可以對不同的URL方案進行操作,它們甚至可能不具有套接字的概念。相反,使用http.client無證sock屬性:

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 2012-01-12 13:27:43

+0

如果你願意編寫你自己的處理程序,你當然可以捕獲HTTPConnection對象。這是AbstractHTTPHandler.do_open(和子類)的第一個參數,但它永遠不會被存儲到任何地方。 – phihag 2012-01-12 13:32:12

+0

是的,我剛剛看到了。我正在考慮寫'urllib2'的擴展名,並且只是覆蓋'AbstractHTTPHandler.do_open'方法來吐出我想要的日誌記錄。無論如何,這確實是需要的。 – Andy 2012-01-12 13:34:01