позиции · сбор данных · отчёты
реклама 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 мес
полезный ответ
Захаров Л. писал: Разбор разметки: чем парсите, когда вёрстка …

Так и есть, проходил через это в прошлом году.

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

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

Присоединяюсь, схема рабочая.

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

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

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