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