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