某些系统上奇怪的urllib2故障

时间:2011-02-15 14:56:04

标签: python linux networking tcp urllib2

我有一个python脚本,它只是用urllib2抓取一个页面,然后继续使用BeautifulSoup来解析那些东西。代码是:

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)

我正在尝试访问的系统是远程的,并且在linux路由器后面,它在公共静态IP和实际系统的lan ip之间进行端口转发。

我在某些系统上遇到了失败,起初我想到了urllib2 / python中的一个错误,或者一些奇怪的TCP内容(http服务器实际上是某个工业系统中的嵌入式卡)。但后来我尝试了其他系统,并且urllib2按预期工作,即使在urllib2失败的系统上,我也可以使用links2或wget正确访问http服务器。

  • Ubuntu 10.04 LTS 32bit远远落后于Apple Airport nat:everythin正常工作
  • Mac OSX 10.6在局域网中与服务器,远程在nat后面等...:一切正常
  • Ubuntu 10.04 LTS 64bit with public ip:urllib2 times out,links and wget work
  • 使用公共IP的Gentoo Linux:urllib2超时,链接和wget工作

我已经在linux路由器(http服务器端)上验证了tcpdump,并且urllib2总是在有问题的系统中完成tcp握手,但是它似乎挂在那里。我试图打开/关闭syncookies和ECN,但这并没有改变任何东西。

我如何调试并可能解决此问题?

2 个答案:

答案 0 :(得分:0)

您还可以切换为使用httplib2

答案 1 :(得分:0)

在将近17个月后,我再也无法访问该特定系统,因此我无法接受这个问题的任何真实答案。

至少我可以告诉未来的读者的答案是什么:

  • 更改为httplib2
  • 不,我们没有获得ICMP重定向
  • 不,我们甚至不丢弃ICMP碎片包

欢呼声。