【问题标题】:strange urllib2 failures on some systems某些系统上奇怪的 urllib2 故障
【发布时间】:2011-02-15 14:56:04
【问题描述】:

我有一个 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 远程 adsl:一切正常
  • 带有服务器的 LAN 中的 Mac OSX 10.6、nat 后面的远程等...:一切正常
  • Ubuntu 10.04 LTS 64bit with public ip: urllib2 超时,链接和 wget 工作
  • Gentoo Linux 与公共 ip: urllib2 超时,链接和 wget 工作

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

我该如何调试并可能解决这个问题?

【问题讨论】:

  • 降低两边的 MTU。或者,更好的是,不要丢弃防火墙所需的 ICMP 碎片。

标签: python linux networking tcp urllib2


【解决方案1】:

您也可以改用httplib2

【讨论】:

    【解决方案2】:

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

    至少我可以告诉未来的读者哪些答案不好

    • 更改为 httplib2
    • 不,我们没有收到 ICMP 重定向
    • 不,我们甚至不丢弃 ICMP 分段数据包

    干杯。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2023-02-07
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多