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