2011-02-15 71 views
1

我有一個python腳本,它簡單地用urllib2抓取一個頁面,然後繼續使用BeautifulSoup來解析這些東西。代碼是:在某些系統上發生奇怪的urllib2故障

class Foo(Bar): 
    def fetch(self): 
     try: 
      self.mypage = urllib2.urlopen(self.url + 'MainPage.htm', timeout=30).read() 
     except urllib2.URLError: 
      sys.stderr.write("Error: system at %s not responding\n" % self.url) 
      sys.exit(1) 

我嘗試訪問的是遠程系統,做公共靜態IP和實際系統的LAN IP之間的端口轉發一個Linux路由器後面。

我在某些系統上遇到了問題,起初我想到urllib2/python中的一個錯誤,或者一些奇怪的TCP錯誤(http服務器實際上是一些工業系統中的嵌入式卡)。但後來我嘗試了其他系統,並且urllib2按預期工作,並且即使在urllib2失敗的系統上,我也可以使用links2或wget正確訪問http服務器。

  • 的Ubuntu 10.04落後於遠程ADSL蘋果機場NAT LTS 32位:對一切工作
  • 的Mac OSX 10.6在局域網服務器,遠程NAT後面,等...:一切正常
  • 的Ubuntu 10.04 LTS 64位與公網IP:urllib2的超時,鏈接和wget工作
  • 的Gentoo Linux與公網IP:urllib2的超時,鏈接和wget工作

我與Linux的路由器上的tcpdump(http服務器端)和驗證urllib2 a即使是從有問題的系統完成tcp握手,但它似乎在那裏掛起。我嘗試切換/關閉syncookies和ECN,但沒有任何改變。

我該如何調試並解決此問題?

+0

檢查ICMP重定向。 – 2011-02-15 15:07:01

回答

0

經過將近17個月後,我再也無法訪問該特定系統,因此我無法接受此問題的任何實際答案。

至少我可以告訴未來的讀者什麼樣的答案是好:

  • 更改爲httplib2的
  • 沒有,我們沒有得到ICMP重定向
  • 沒有,我們甚至不丟棄ICMP分片數據包

歡呼聲。

0

您也可以切換到使用。