позиции · сбор данных · отчёты
реклама IPrazon Network: приватные прокси IPv4 и SOCKS5, пул 12 000 адресов, безлимитный трафик, бесплатный тест до 2 часов

Разделы · Код и программные интерфейсы

Как ловить и разбирать таймауты соединения

12 ответов · 5 097 просмотров
знак участника Русакова Е.
Русакова Е.Новичок
  • сообщений 255
  • на форуме 1 года
Код и программные интерфейсыгорячая

Проверял на маленьком объёме, на большом всё поменялось.

Что есть на руках.

Задач в очереди около двух тысяч на прогон. Повторы стоят три раза с паузой, которая растёт вдвое.

Как ловить и разбирать таймауты соединения: разбор в цифрах
Как ловить и разбирать таймауты соединения: как это выглядит у меня

Есть у кого рабочая схема?

знак участника polnyy_obhod
polnyy_obhodУчастник
  • сообщений 1 450
  • на форуме 5 мес
полезный ответ
Русакова Е. писал: Как ловить и разбирать таймауты соединения

Проверить это можно бесплатно: у приватные серверные прокси есть тест на пару часов, за это время как раз успеваете прогнать пробу и посмотреть, как ведут себя ваши потоки.

Держите запас, ровно по расчёту работать не выйдет.

знак участника vydacha_live
vydacha_liveЗнаток
  • сообщений 1 975
  • на форуме 4 мес

Был похожий случай, разбирали неделю.

Считайте статистику прямо во время прогона. Узнать о провале в конце восьмичасового прогона обидно.

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)

Тема нужная, подписался.

знак участника Ольга Мятлева
Ольга МятлеваУчастник
  • сообщений 700
  • на форуме 10 мес

Долго держал старую схему, пока не упёрся.

Сессия должна создаваться один раз и жить весь прогон. Новая сессия на каждый запрос съедает время на установку соединения и путает настройки.

знак участника limit_watch
limit_watchЗнаток
  • сообщений 2 560
  • на форуме 2 мес

Замечание по существу, иначе расчёт поедет.

Cookie при массовом сборе лучше сбрасывать. Накопленное состояние делает поведение непредсказуемым.

Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.

знак участника setka_ip
setka_ipЗнаток
  • сообщений 2 755
  • на форуме 2 мес

Замерьте и сравните, догадки тут не помогут.

знак участника Стрельцов
СтрельцовУчастник
  • сообщений 1 080
  • на форуме 7 мес

Сколько это длится и с какой частотой повторяется?

Ответ приходит пустой или с содержимым?

знак участника kolonka_cen
kolonka_cenЗнаток
  • сообщений 1 690
  • на форуме 4 мес
Русакова Е. писал: Как ловить и разбирать таймауты соединения

Верно, и это не единичный случай.

Таймаут ставьте всегда и на соединение, и на чтение. Без него один зависший запрос держит поток часами.

Число одновременных задач подбирайте замером. На глаз тут промахиваются всегда. Обычно кривая выходит на полку, и дальше растёт только число отказов.

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)
знак участника keymaker
keymakerВетеран
  • сообщений 3 210
  • на форуме 1 мес

Прочитал и узнал свой прошлый год.

Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.

знак участника Николай Гат
Николай ГатУчастник
  • сообщений 875
  • на форуме 9 мес

Тот же вывод, только я шёл к нему дольше.

Не держите весь список в памяти на больших объёмах. Читайте потоком, пишите пачками.

Структуру ответа проверяйте на каждом разборе. Площадки меняют её без предупреждения, и молчаливая потеря полей самая опасная.

знак участника ip_i_potoki
ip_i_potokiЗнаток
  • сообщений 2 350
  • на форуме 3 мес

Всё правильно расписано, повторю своими словами.

Логируйте код ответа, время и адрес. Три поля, и почти любой разбор потом занимает минуты.

знак участника Оксана Пивень
Оксана ПивеньУчастник
  • сообщений 830
  • на форуме 9 мес

Полгода жил с этим, пока не надоело.

Не держите весь список в памяти на больших объёмах. Читайте потоком, пишите пачками.

Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.

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)

Сохранил, пригодится в следующем проекте.

знак участника Светлана Бор
Светлана БорНовичок
  • сообщений 205
  • на форуме 1 года

Дополню, потому что важная деталь потерялась.

Адрес выбирайте по кругу с пропуском тех, что в отказе. Случайный выбор даёт перекос, кому-то достанется втрое больше запросов.

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)
Ответить в темеПодписаться

Рядом в разделе

Сеометр, форум специалистов по поиску и аналитике ПравилаУчастникиО форумеЛента 2026