2011-02-15 63 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

您也可以切换到使用。