Разделы · Код и программные интерфейсы
Проверял на маленьком объёме, на большом всё поменялось.
Состояние прогона храню в файле, чтобы продолжать после обрыва. Логирую код ответа, время и адрес, по которому шёл запрос. Питон, асинхронный сбор, одновременно держу около двухсот задач.
Как считаете вы? Интересует порядок, а не общие слова.
Почти так, но одна деталь меняет вывод.
Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.
Проверял это на своей задаче, вывод такой же.
Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.
Сессия должна создаваться один раз и жить весь прогон. Новая сессия на каждый запрос съедает время на установку соединения и путает настройки.
До этого работало? Что менялось перед тем, как сломалось?
Уменьшите потоки вдвое и замерьте заново.
Полгода назад ловил то же самое.
Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.
Логируйте код ответа, время и адрес. Три поля, и почти любой разбор потом занимает минуты.
Долго держал старую схему, пока не упёрся.
Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.
Состояние прогона храните построчно, а не одним куском в конце. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Согласен с предыдущим ответом, но с одной оговоркой.
Число одновременных задач подбирайте замером, а не на глаз. Обычно кривая выходит на полку, и дальше растёт только число отказов.
async with aiohttp.ClientSession() as s:
for i in range(3):
try:
r = await s.get(url, proxy=adres, timeout=30)
break
except Exception:
await asyncio.sleep(2 ** i)Согласен с предыдущим ответом, но с одной оговоркой.
Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.
Всё верно написали выше, добавлю от себя пару деталей.
Число одновременных задач подбирайте замером, а не на глаз. Обычно кривая выходит на полку, и дальше растёт только число отказов.
У нас на прошлом проекте это выглядело так.
Логируйте код ответа, время и адрес. Три поля, и почти любой разбор потом занимает минуты.
Смотрите подсети, а не только число адресов.
Тут ничего нового не скажу, только подтвержу.
Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.
async with aiohttp.ClientSession() as s:
for i in range(3):
try:
r = await s.get(url, proxy=adres, timeout=30)
break
except Exception:
await asyncio.sleep(2 ** i)
Если поможет, напишите здесь же, пригодится следующим.
Подтверждаю, у нас было ровно то же самое.
Логируйте код ответа, время и адрес. Три поля, и почти любой разбор потом занимает минуты.
Хороший разбор, добавлю в закладки.
Логи в помощь, без них это гадание.
Уточните пару моментов, иначе гадаем.
Это на всех площадках или на одной?