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