【发布时间】: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