Избегайте зависания на conn.getresponse () (httplib.HTTPConnection) - PullRequest
3 голосов
/ 20 декабря 2011

Я написал сканер на python для загрузки некоторых веб-страниц с веб-сайта на основе заданных URL-адресов.Я заметил, что иногда моя программа зависает в этой строке "conn.getresponse ()".Не было никаких исключений, и программа просто ждала там вечно.

conn = httplib.HTTPConnection(component.netloc)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #hang here

Я прочитал API-документ и он говорит, что (чтобы добавить тайм-аут):

conn = httplib.HTTPConnection(component.netloc, timeout=10)

Однаконе позволяет мне «повторить» соединение.Какова наилучшая практика повторного сканирования после тайм-аута?

Например, я думаю о следующем решении:

trials = 3
while trials > 0:
    try:
        ... code here ...
    except:
        trials -= 1

Я в правильном направлении?

1 Ответ

1 голос
/ 20 декабря 2011

Однако это не позволяет мне «повторить» соединение.

Да, тайм-аут разработан, чтобы отодвинуть эту политику туда, где она есть, в вашем коде (и внеиз httplib).

Каков наилучший способ повторить сканирование после истечения времени ожидания?

Это очень зависит от приложения.Как долго ваш сканер может отложить свою другую работу?Насколько сильно вы хотите, чтобы он глубоко проник в каждый сайт?Вы должны быть в состоянии терпеть медленные, переподписанные серверы?А как насчет серверов, которые имеют дроссели или другие контрмеры, когда они сталкиваются со сканерами?Пока я спрашиваю, уважаете ли вы robots.txt?

Поскольку ответы на эти вопросы, вероятно, сильно различаются, имеет смысл настроить это на потребности вашего сканера, на сайты, которые вы склонны сканировать (если предположить,Есть тенденции), и ваша производительность WAN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...