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