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

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

Разбор разметки: чем парсите, когда вёрстка меняется

15 ответов · 4 935 просмотров
знак участника Захаров Л.
Захаров Л.Участник
  • сообщений 1 310
  • на форуме 8 мес
Код и программные интерфейсыгорячая

Задача техническая, прошу совета по устройству.

Состояние прогона храню в файле, чтобы продолжать после обрыва. Список адресов читаю из файла и раздаю по кругу.

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)

Буду признателен за конкретику.

знак участника Барсов
БарсовУчастник
  • сообщений 1 420
  • на форуме 8 мес
полезный ответ
Захаров Л. писал: Разбор разметки: чем парсите, когда вёрстка …

Подтверждаю, у нас было ровно то же самое.

Разбор ответа держите отдельно от сбора. Тогда смена разметки не требует перегонять данные заново, достаточно перечитать сохранённое.

знак участника Валерия Гонт
Валерия ГонтНовичок
  • сообщений 268
  • на форуме 1 года

А что показывают логи в момент падения?

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

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

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

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

знак участника Дёмин С.
Дёмин С.Участник
  • сообщений 1 190
  • на форуме 5 мес
полезный ответ

Проверял два поставщика на одинаковой задаче. Тот, где не режут трафик, дал прогон в полтора раза быстрее. Сейчас работаю через приватные прокси IPv4 и SOCKS5.

Проверьте, что настройка вообще применилась.

знак участника Костин
КостинНовичок
  • сообщений 540
  • на форуме 1 года

Был случай, когда всё сошлось только на третий день разбора.

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

знак участника Алина Прошина
Алина ПрошинаНовичок
  • сообщений 140
  • на форуме 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)

Держите нас в курсе.

знак участника Симаков
СимаковУчастник
  • сообщений 780
  • на форуме 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)
знак участника Саша Верхов
Саша ВерховНовичок
  • сообщений 152
  • на форуме 1 года
Захаров Л. писал: Разбор разметки: чем парсите, когда вёрстка …

Уменьшите потоки вдвое и замерьте заново.

знак участника Тимофей Бек
Тимофей БекУчастник
  • сообщений 610
  • на форуме 11 мес

Считайте по темпу, всё остальное вторично.

знак участника Тереза К.
Тереза К.Ветеран
  • сообщений 3 907
  • на форуме 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)
знак участника Тучков
ТучковНовичок
  • сообщений 430
  • на форуме 1 года
Захаров Л. писал: Разбор разметки: чем парсите, когда вёрстка …

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

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

знак участника Эдуард Мель
Эдуард МельУчастник
  • сообщений 730
  • на форуме 10 мес

Всё верно написали выше, добавлю от себя пару деталей.

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

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

знак участника Гаврилин
ГаврилинУчастник
  • сообщений 1 330
  • на форуме 8 мес

Осторожнее с этим выводом, он верен не всегда.

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

знак участника Вадим Кучер
Вадим КучерНовичок
  • сообщений 165
  • на форуме 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