Разделы · Код и программные интерфейсы
Переписываю старый скрипт и хочу сделать правильно.
Чтобы вопрос был предметным, вот цифры.
Результаты пишу пачками по тысяче строк. Логирую код ответа, время и адрес, по которому шёл запрос. Питон, асинхронный сбор, одновременно держу около двухсот задач.
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)У нас на прошлом проекте это выглядело так.
Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.
Начните с малого объёма и растите постепенно.
Сколько адресов и какой темп при этом стоит?
Тут ничего нового не скажу, только подтвержу.
Состояние прогона храните построчно, а не одним куском в конце. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Тема нужная, подписался.
Полгода назад ловил то же самое.
Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.
Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.
Какая версия программы и что с настройками по умолчанию?
Тут ничего нового не скажу, только подтвержу.
Сессия должна создаваться один раз и жить весь прогон. Новая сессия на каждый запрос съедает время на установку соединения и путает настройки.
Отпишитесь, чем закончится, тема полезная.