maofet
Сен. 5, 2012 20:32:09
Добрый день.
Пользуюсь Python 2.7 и столкнулся с такой проблемой:
в цикле происходит получение html-кода страницы.
st = urllib2.urlopen(a)
b = st.read()
Циклов около 1000. На произвольном месте переменная st определяется, а получение переменной b зависает на бесконечное время.
Пробовал добавлять st.close() - не помогло.
Пробовал ставить таймер - не помогло.
Если открыть ссылку в браузере - все ок. Если перезапусить скрипт, то на этой ссылке будет тоже все ок, но на другой обязательно зависнет.
Чем это может быть вызвано? И какие есть решения, в т.ч. обходные пути?
Заранее благодарен за ответ.
odnochlen
Сен. 5, 2012 21:38:59
Посмотри снифферов, напр. Wireshark, Commview.
maofet
Сен. 6, 2012 00:55:17
Попробовал установить WireShark.
Для меня, к сожалению, довольно сложный продукт.
Что я смог установить:
При получении данных часто возникают warnings двух типов:
1. Previous segment not captured
2. Duplicate ACK
Если то, о чем говорится в первом, я могу предположить, то о втором я в поиске тоже не нашел дельных описаний.
Причем, судя по наблюдениям п.1 не всегда критичен для получения данных.
А что делать с п.2?
odnochlen
Сен. 6, 2012 01:41:53
Ты в слишком низкоуровневую хрень залез.
1. Напиши в строку фильтра http.
2. Щелкни правой кнопкой на пакете -> follow tcp stream. И читай там.
То же самое в commview - два раза щелкаешь на любом непустом tcp пакете и дальше щелкаешь “следующая сессия” Там даже есть просмотровщик html.
maofet
Сен. 6, 2012 08:19:59
А что я там должен увидеть?
После нажатия на Follow tcp stream мне вывелся html, но он не подсвечивает, как я понимаю, в каком месте кода html ошибка…
odnochlen
Сен. 6, 2012 08:30:16
read() блокирует, если сервер ничего не посылает. Ты можешь посмотреть, что при этом происходит в сети.
А вообще я бы тебе советовал взять grab или requests. Встроенные библиотеки питона зело убоги.
maofet
Сен. 7, 2012 20:52:04
Спасибо, с requests действительно не возникает пока таких проблем!