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