У меня есть скрипт на 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-адресом и локальной сетью IP-адреса реальной системы.
У меня возникали сбои в некоторых системах, и сначала я подумал об ошибке в urllib2 / python или о какой-то странной вещи TCP (сервер HTTP на самом деле является встроенной картой в какой-то промышленной системе). Но затем я попробовал другие системы, и urllib2 работает как положено, и я также могу правильно получить доступ к http-серверу, используя links2 или wget, даже в тех системах, где происходит сбой urllib2.
- Ubuntu 10.04 LTS 32-битный от Apple Airport nat на удаленном adsl: все работает
- Mac OSX 10.6 в локальной сети с сервером, удаленным за nat и т.д ...: все работает
- Ubuntu 10.04 LTS 64bit с общедоступным временем ожидания IP-адреса: urllib2, ссылки и wget работают
- Gentoo Linux с общедоступным временем ожидания ip: urllib2, ссылками и работой wget
Я проверил tcpdump на роутере linux (на стороне http-сервера), а urllib2 всегда завершает рукопожатие tcp даже из проблемных систем, но затем кажется, что оно зависает там. Я пытался включить / выключить syncookies и ECN, но это ничего не изменило.
Как я могу отладить и, возможно, решить эту проблему?