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