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