Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 5, 2012 20:32:09

maofet
Зарегистрирован: 2012-09-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

Добрый день.
Пользуюсь Python 2.7 и столкнулся с такой проблемой:
в цикле происходит получение html-кода страницы.
st = urllib2.urlopen(a)
b = st.read()
Циклов около 1000. На произвольном месте переменная st определяется, а получение переменной b зависает на бесконечное время.
Пробовал добавлять st.close() - не помогло.
Пробовал ставить таймер - не помогло.
Если открыть ссылку в браузере - все ок. Если перезапусить скрипт, то на этой ссылке будет тоже все ок, но на другой обязательно зависнет.
Чем это может быть вызвано? И какие есть решения, в т.ч. обходные пути?
Заранее благодарен за ответ.

Офлайн

#2 Сен. 5, 2012 21:38:59

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

Посмотри снифферов, напр. Wireshark, Commview.

Офлайн

#3 Сен. 6, 2012 00:55:17

maofet
Зарегистрирован: 2012-09-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

Попробовал установить WireShark.
Для меня, к сожалению, довольно сложный продукт.
Что я смог установить:
При получении данных часто возникают warnings двух типов:
1. Previous segment not captured
2. Duplicate ACK
Если то, о чем говорится в первом, я могу предположить, то о втором я в поиске тоже не нашел дельных описаний.
Причем, судя по наблюдениям п.1 не всегда критичен для получения данных.
А что делать с п.2?

Офлайн

#4 Сен. 6, 2012 01:41:53

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

Ты в слишком низкоуровневую хрень залез.

1. Напиши в строку фильтра http.
2. Щелкни правой кнопкой на пакете -> follow tcp stream. И читай там.

То же самое в commview - два раза щелкаешь на любом непустом tcp пакете и дальше щелкаешь “следующая сессия” Там даже есть просмотровщик html.

Офлайн

#5 Сен. 6, 2012 08:19:59

maofet
Зарегистрирован: 2012-09-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

А что я там должен увидеть?
После нажатия на Follow tcp stream мне вывелся html, но он не подсвечивает, как я понимаю, в каком месте кода html ошибка…

Офлайн

#6 Сен. 6, 2012 08:30:16

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

read() блокирует, если сервер ничего не посылает. Ты можешь посмотреть, что при этом происходит в сети.

А вообще я бы тебе советовал взять grab или requests. Встроенные библиотеки питона зело убоги.

Офлайн

#7 Сен. 7, 2012 20:52:04

maofet
Зарегистрирован: 2012-09-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависание функции read() в urllib2

Спасибо, с requests действительно не возникает пока таких проблем!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version