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