Меня зовут Даниил Охлопков, и я расскажу про свой подход к написанию скриптов, извлекающих данные из интернета: с чего начать, куда смотреть и что использовать.

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

TL;DR

Чтобы спарсить данные с вебсайта, пробуйте подходы именно в таком порядке:

  1. Найдите официальное API,

  2. Найдите XHR запросы в консоли разработчика вашего браузера,

  3. Найдите сырые JSON в html странице,

  4. Отрендерите код страницы через автоматизацию браузера,

  5. Если ничего не подошло - пишите парсеры HTML кода.

Совет профессионалов: не начинайте с BS4/Scrapy

BeautifulSoup4 и Scrapy - популярные инструменты парсинга HTML страниц (и не только!) для Python.

Крутые вебсайты с крутыми продактами делают тонну A/B тестов, чтобы повышать конверсии, вовлеченности и другие бизнес-метрики. Для нас это значит одно: элементы на вебстранице будут меняться и переставляться. В идеальном мире, наш написанный парсер не должен требовать доработки каждую неделю из-за изменений на сайте.

Приходим к выводу, что не надо извлекать данные из HTML тегов раньше времени: разметка страницы может сильно поменяться, а CSS-селекторы и XPath могут не помочь. Используйте другие методы, о которых ниже. ⬇️

Используйте официальный API

???? Ого? Это не очевидно ????? Конечно, очевидно! Но сколько раз было: сидите пилите парсер сайта, а потом БАЦ - нашли поддержку древней RSS-ленты, обширный sitemap.xml или другие интерфейсы для разработчиков. Становится обидно, что поленились и потратили время не туда. Даже если API платный, иногда дешевле договориться с владельцами сайта, чем тратить время на разработку и поддержку.

Sitemap.xml - список страниц сайта, которые точно нужно проиндексировать гуглу. Полезно, если нужно найти все объекты на сайте. Пример: http://techcrunch.com/sitemap.xml

RSS-лента - API, который выдает вам последние посты или новости с сайта. Было раньше популярно, сейчас все реже, но где-то еще есть! Пример: https://habr.com/ru/rss/hubs/all/

Поищите XHR запросы в консоли разработчика

Кабина моего самолета
Кабина моего самолета

Все современные вебсайты (но не в дарк вебе, лол) используют Javascript, чтобы догружать данные с бекенда. Это позволяет сайтам открываться плавно и скачивать контент постепенно после получения структуры страницы (HTML, скелетон страницы).

Обычно, эти данные запрашиваются джаваскриптом через простые GET/POST запросы. А значит, можно подсмотреть эти запросы, их параметры и заголовки - а потом повторить их у себя в коде! Это делается через консоль разработчика вашего браузера (developer tools).

В итоге, даже не имея официального API, можно воспользоваться красивым и удобным закрытым API. ☺️

Даже если фронт поменяется полностью, этот API с большой вероятностью будет работать. Да, добавятся новые поля, да, возможно, некоторые данные уберут из выдачи. Но структура ответа останется, а значит, ваш парсер почти не изменится.

Алгорим действий такой:

  1. Открывайте вебстраницу, которую хотите спарсить

  2. Правой кнопкой -> Inspect (или открыть dev tools как на скрине выше)

  3. Открывайте вкладку Network и кликайте на фильтр XHR запросов

  4. Обновляйте страницу, чтобы в логах стали появляться запросы

  5. Найдите запрос, который запрашивает данные, которые вам нужны

  6. Копируйте запрос как cURL и переносите его в свой язык программирования для дальнейшей автоматизации.

Кнопка, которую я искал месяцы
Кнопка, которую я искал месяцы

Вы заметите, что иногда эти XHR запросы включают в себя огромные строки - токены, куки, сессии, которые генерируются фронтендом или бекендом. Не тратьте время на ревёрс фронта, чтобы научить свой парсер генерировать их тоже.

Вместо этого попробуйте просто скопипастить и захардкодить их в своем парсере: очень часто эти строчки валидны 7-30 дней, что может быть окей для ваших задач, а иногда и вообще несколько лет. Или поищите другие XHR запросы, в ответе которых бекенд присылает эти строчки на фронт (обычно это происходит в момент логина на сайт). Если не получилось и без куки/сессий никак, - советую переходить на автоматизацию браузера (Selenium, Puppeteer, Splash - Headless browsers) - об этом ниже.

Поищите JSON в HTML коде страницы

Как было удобно с XHR запросами, да? Ощущение, что ты используешь официальное API. ???? Приходит много данных, ты все сохраняешь в базу. Ты счастлив. Ты бог парсинга.

Но тут надо парсить другой сайт, а там нет нужных GET/POST запросов! Ну вот нет и все. И ты думаешь: неужели расчехлять XPath/CSS-selectors? ????‍♀️ Нет! ????‍♂️

Чтобы страница хорошо проиндексировалась поисковиками, необходимо, чтобы в HTML коде уже содержалась вся полезная информация: поисковики не рендерят Javascript, довольствуясь только HTML. А значит, где-то в коде должны быть все данные.

Современные SSR-движки (server-side-rendering) оставляют внизу страницы JSON со всеми данные, добавленный бекендом при генерации страницы. Стоп, это же и есть ответ API, который нам нужен! ????????????

Вот несколько примеров, где такой клад может быть зарыт (не баньте, плиз):

Красивый JSON на главной странице Habr.com. Почти официальный API! Надеюсь, меня не забанят.
Красивый JSON на главной странице Habr.com. Почти официальный API! Надеюсь, меня не забанят.
И наш любимый (у парсеров) Linkedin!
И наш любимый (у парсеров) Linkedin!

Алгоритм действий такой:

  1. В dev tools берете самый первый запрос, где браузер запрашивает HTML страницу (не код текущий уже отрендеренной страницы, а именно ответ GET запроса).

  2. Внизу ищите длинную длинную строчку с данными.

  3. Если нашли - повторяете у себя в парсере этот GET запрос страницы (без рендеринга headless браузерами). Простоrequests.get.

  4. Вырезаете JSON из HTML любыми костылямии (я использую html.find("={")).

Отрендерите JS через Headless Browsers

Если XHR запросы требуют актуальных tokens, sessions, cookies. Если вы нарываетесь на защиту Cloudflare. Если вам обязательно нужно логиниться на сайте. Если вы просто решили рендерить все, что движется загружается, чтобы минимизировать вероятность бана. Во всех случаях - добро пожаловать в мир автоматизации браузеров!

Если коротко, то есть инструменты, которые позволяют управлять браузером: открывать страницы, вводить текст, скроллить, кликать. Конечно же, это все было сделано для того, чтобы автоматизировать тесты веб интерфейса. I'm something of a web QA myself.

После того, как вы открыли страницу, чуть подождали (пока JS сделает все свои 100500 запросов), можно смотреть на HTML страницу опять и поискать там тот заветный JSON со всеми данными.

driver.get(url_to_open)
html = driver.page_source

Selenoid - open-source remote Selenium cluster

Для масштабируемости и простоты, я советую использовать удалённые браузерные кластеры (remote Selenium grid).

Недавно я нашел офигенный опенсорсный микросервис Selenoid, который по факту позволяет вам запускать браузеры не у себя на компе, а на удаленном сервере, подключаясь к нему по API. Несмотря на то, что Support team у них состоит из токсичных разработчиков, их микросервис довольно просто развернуть (советую это делать под VPN, так как по умолчанию никакой authentication в сервис не встроено). Я запускаю их сервис через DigitalOcean 1-Click apps: 1 клик - и у вас уже создался сервер, на котором настроен и запущен кластер Headless браузеров, готовых запускать джаваскрипт!

Вот так я подключаюсь к Selenoid из своего кода: по факту нужно просто указать адрес запущенного Selenoid, но я еще зачем-то передаю кучу параметров бразеру, вдруг вы тоже захотите. На выходе этой функции у меня обычный Selenium driver, который я использую также, как если бы я запускал браузер локально (через файлик chromedriver).

def get_selenoid_driver(
    enable_vnc=False, browser_name="firefox"
):
    capabilities = {
        "browserName": browser_name,
        "version": "",
        "enableVNC": enable_vnc,
        "enableVideo": False,
        "screenResolution": "1280x1024x24",
        "sessionTimeout": "3m",
        
        # Someone used these params too, let's have them as well
        "goog:chromeOptions": {"excludeSwitches": ["enable-automation"]},
        "prefs": {
            "credentials_enable_service": False, 			
            "profile.password_manager_enabled": False
        },
    }

    driver = webdriver.Remote(
        command_executor=SELENOID_URL,
        desired_capabilities=capabilities,
    )
    driver.implicitly_wait(10)  # wait for the page load no matter what

    if enable_vnc:
        print(f"You can view VNC here: {SELENOID_WEB_URL}")
    return driver

Заметьте фложок enableVNC. Верно, вы сможете смотреть видосик с тем, что происходит на удалённом браузере. Всегда приятно наблюдать, как ваш скрипт самостоятельно логинится в Linkedin: он такой молодой, но уже хочет познакомиться с крутыми разработчиками.

Парсите HTML теги

Если случилось чудо и у сайта нет ни официального API, ни вкусных XHR запросов, ни жирного JSON внизу HTML, если рендеринг браузерами вам тоже не помог, то остается последний, самый нудный и неблагодарный метод. Да, это взять и начать парсить HTML разметку страницы. То есть, например, из <a href="https://okhlopkov.com">Cool website</a> достать ссылку. Это можно делать как простыми регулярными выражениями, так и через более умные инструменты (в питоне это BeautifulSoup4 и Scrapy) и фильтры (XPath, CSS-selectors).

Мой единственный совет: постараться минимизировать число фильтров и условий, чтобы меньше переобучаться на текущей структуре HTML страницы, которая может измениться в следующем A/B тесте.


Даниил Охлопков - Data Lead @ Runa Capital

Подписывайтесь на мой Телеграм канал, где я рассказываю свои истории из парсинга и сливаю датасеты.

Надеюсь, что-то из этого было полезно! Я считаю, что в парсинге важно, с чего ты начинаешь. С чего начать - я рассказал, а дальше ваш ход ????

Комментарии (88)


  1. SergeyEgorov
    22.09.2021 13:58
    +15

    А еще будьте готовы арендовать несколько разных пакетов прокси на разных сервисах, когда столкнетесь с тем, что сайты, которые вы скрэпите начали включать защитные алгоритмы против любителей регулярного автоматического копирования их контента.


    1. ohld Автор
      22.09.2021 14:17

      Всегда можно попробовать использовать сеть TOR как пул бесплатных прокси! https://github.com/mattes/rotating-proxy


      1. ArsenAbakarov
        22.09.2021 15:57
        +8

        Плавали, знаем.. ip адреса выходных нод публично доступны и бывает что на это завязана защита


      1. Layan
        22.09.2021 16:53
        +2

        Обычно как раз против таких публичных прокси защита есть из коробки. Например, в AWS WAF она включается парой нажатий.

        И, как показала практика, это почти весь вредоносный трафик отсекает.


      1. SergeyEgorov
        22.09.2021 19:50
        +1

        Именно этот вариант не пробовал. Честно говоря не очень верю в эффективность подобных средств, исходники которых правились в репозитории пять лет назад.

        Я пробовал разного рода списки дешевых прокси за $10 в месяц три пачки. Неудачный опыт. Много ошибок обработки запросов, масса мертвых адресов, масса обрывов соединений. Нервотрепка в общем.

        Субъективно, из того что я использовал, адекватные прокси услуги обычно стоят от $90-$100 долларов в месяц. Что называется "включил и забыл". Единственное за чем надо следить, это за остатком кредитов на балансе, которые списываются по мере пользования сервисом.


    1. MarkFish
      22.09.2021 14:18

      С этим разве есть какие-то сложности?

      Да и мне кажется, прокси, это первое о чем думает человек, которому требуется что-то спарсить.


      1. ohld Автор
        22.09.2021 14:24

        Сложность с прокси начинается тогда, когда ты хочешь их использовать для Headless Browsers. Если ты подключил сервис, который биллит за каждый запрос, например https://www.zyte.com/smart-proxy-manager/, то будь готов открыть для себя очевидное:

        Современные сайты делают ДЕСЯТКИ запросов в момент открытия страницы. А значит, тебя будут биллить за каждую картиночку, за каждый рекламный баннер, за каждый web analytics event. Есть решение использовать ad blocker chrome extension, чтобы грузить только то, что надо.

        И тут начинается гонка вооружений.


        1. SergeyEgorov
          22.09.2021 17:56
          +2

          Нет такой проблемы. Есть сервисы с API, которые за дополнительную плату сами рендерят результирующую страницу со всеми яваскриптами и отдают тебе в готовом виде. При этом стоимость обычного запроса скажем 1 кредит, а стоимость запроса с рендерингом 5 кредитов. В общем вполне выгодное предложение, потому что действительно загрузка одной страницы способна сгенерировать сотню дополнительных запросов.


          1. cry_san
            23.09.2021 08:15
            +2

            -Есть сервисы с API, которые за дополнительную плату сами рендерят результирующую страницу

            Можно пару ссылок?


            1. SergeyEgorov
              23.09.2021 10:04
              +1

              Я пользуюсь вот этими двумя:

              https://www.webscrapingapi.com/

              https://zenscrape.com/


              1. cry_san
                02.10.2021 05:06
                +1

                Хм, расчет от количества запросов.

                Выходит дорого, если парсить, например, WB.

                Пользуюсь https://brightdata.com, расчет от объема. Думал у вас лучше )


                1. gremlin244
                  23.09.2021 01:31

                  Репутация там точно не работает. Точнее там есть какой-то рейтинг, но он вообще непрозрачный, считается черт знает как, и абсолютно ни на что не влияет. Но даже если бы влиял, там вполне процветает мультиаккаунтинг.


          1. aborouhin
            22.09.2021 21:54

            Ну там крайне специфическая ситуация, когда на государственной базе в качестве оператора оной сидит коммерческая организация, которая сама на эксклюзивном доступе к ней из своих коммерческих продуктов в основном и зарабатывает. Причём ответственный за базу госорган с этим ничего сделать не может. В общем, смешная история, но тут не хочу вдаваться в подробности. Так что ничего не слито, а стоимость договорённости с оператором базы измеряется не сотнями баксов, а как минимум сотнями тысяч их же. После чего тебе придётся конкурировать с построенными на этих данных коммерческими продуктами самогó оператора базы, который этих денег никому не платил.

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

            Насчёт Толоки идея, к слову, неплохая, спасибо. Надо только прикинуть возможную скорость и стоимость. Сомнения в основном насчёт скорости. Ну и какой-нибудь инструмент для автоматизации нелёгкого труда толокеров на коленке создать. Подумаю на досуге.


          1. ohld Автор
            22.09.2021 21:55

            Про толоку - в точку! Иногда дешевле запрячь индусов руками собирать данные с вебсайта. Более того, это 100% легально, так как запрещают часто именно автоматизированный сбор данных.


            1. gremlin244
              22.09.2021 23:04

              Это нужно будет сильно заморочиться с тем как организовать проверки и всякое такое. А то толокеры вам такого наразмечают. Там народ уже очень ушлый. Амазон и Бинг вот сейчас балуются там иногда оценкой релевантности выдачи и тому подобным на всяких языках, очевидно никому там неведомых. Так астрологи сразу объявили неделю полиглотов, количество толокеров знающих, судя по профилю, японский, арабский, хинди и шведский выросло втрое. Не думаю что им понравится датасет в итоге, который они получат)


      1. aborouhin
        22.09.2021 21:17

        Сложность начинается, когда тебе, чтобы увидеть результат парсинга при жизни, надо парсить хотя бы несколько сотен тысяч страниц в день, а защита от парсинга начинает тебя блокировать уже после нескольких десятков штук оных.
        Есть одна государственная, к слову говоря, база данных (уточняю, чтобы закрыть вопрос о этичности её парсинга, а юридических вопросов даже не буду касаться, там вообще мрак с этим), которую очень много кто на рынке хотел бы спарсить целиком и использовать для разумного, доброго, вечного... Однако ж ни у кого не получилось.
        Около 50 миллионов документов (PDF) + несколько миллионов страниц со ссылками на оные - и буземно параноидальная защита, от которой живые-то пользователи страдают. Плюс всякие фокусы типа webassembly, игнорирование которого увеличивает степень паранойи на порядок.


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


    1. VioletGiraffe
      22.09.2021 18:05

      Меня эта проблема тоже беспокоит, как начинающего писателя поискового движка. Чтобы контент просто проиндексировать и честно на него сослаться — тоже нужно сначала распарсить. Какие могут быть решения для этой проблемы? Только грубая сила — куча прокси с разными IP, ну и не качать много страниц с одного сайта подряд?


      1. vedenin1980
        22.09.2021 18:14
        +3

        куча прокси с разными IP, ну и не качать много страниц с одного сайта подряд

        Мне кажется, для поискового движка честнее один чистый IP, соблюдающий robots.txt, говорить «я поисковый бот» и делать запросы к разным сайтам по очереди, там чтобы между каждым запросом к одному сайту проходило много времени.


      1. ohld Автор
        22.09.2021 18:17

        Насколько я понимаю, у поисковых краулеров есть волшебный user-agent, который пропускают всякие защиты. Как влететь в эту VIP тусовку не знаю. Можно попробовать прикинуться гугловым краулером, мб получится.


        1. pexey40317
          22.09.2021 19:33
          +8

          У всех известных поисковых ботов есть список публичных ip адресов. Можно прикинуться любым ботом, но вот если ip будет отличаться, то некоторые сайты внесут в черный список этот адрес (временно конечно).

          Как влететь в эту VIP тусовку не знаю.

          Вероятно написать популярный поисковик.


        1. mrBarabas
          23.09.2021 21:08
          +1

          Это самый плохой совет, поисковые боты очень легко проверяются и чаще всего банятся в первую очередь именно псевдопоисковые боты.


    1. BackDoorMan
      23.09.2021 16:26
      +1

      Пакеты прокси - это для начинающих) Когда идет серьезная работа, то может спокойно пыхтеть ферма из десяток мобилок)


      1. SergeyEgorov
        23.09.2021 18:09
        +1

        Пакет мобильных прокси точно так же легко арендуется, так что это не более чем вопрос личных предпочтений и бюджета. У меня нет никакого желания строить фермы из мобилок, я предпочитаю специализироваться в разработке. Эксплуатация резидентных прокси ферм меня вообще никак не торкает. Это совершенно отдельный бизнес на мой взгляд.


  1. korsetlr473
    22.09.2021 14:18
    +2

    paputee как понимаю сейчас топ 1 ?


    1. ohld Автор
      22.09.2021 14:20
      +1

      Если вы про puppeteer, то я не думаю, что есть top-1 of Headless browsers.

      По умолчанию, все такие браузеры обвешаны метками "я автоматизированный браузер", которые часто легко детектируются анти-парсинг системами. Есть крякнутые Chromedrivers, в которых эти дыры убрали, например, вот: https://github.com/ultrafunkamsterdam/undetected-chromedriver


      1. ArtyL
        22.09.2021 16:45

        Puppeteer нынче никто не носит. Сейчас набирает популярность playwright. Он в активной разработке, функционально богаче чем pouppeteer, есть поддержка python и java от разработчика. Поддержка разных браузеров, не удалось сходить хромом, сходили Firefox.


        1. cry_san
          23.09.2021 04:56

          Дайте ссылку на playwright

          Спасибо!


          1. fougasse
            23.09.2021 07:57
            +1

            1. dark_gf
              23.09.2021 16:58

              А этот playwright, сайт может его определить как автоматизированный браузер?


              1. ohld Автор
                23.09.2021 17:17

                Как я понял, это просто обертка над Chromedriver - удобный интерфейс для него. Поэтому тут уже вопрос, насколько Chromedriver без следов автоматизации.


      1. SergeyEgorov
        22.09.2021 18:00
        +1

        У меня почти год уже как puppeteer основной рабочий инструмент скрэпинга и ни разу меня не забанили за `автоматизированность браузера`. Почти всегда банят за один и тот же IP источника исходящих запросов с высоким рейтом в единицу времени.


        1. vedenin1980
          22.09.2021 18:10
          +1

          и ни разу меня не забанили за

          Существует «серый бан», когда боту выдают только кешированную информацию или даже неправильные данные причем не всегда, а с определенной частотой. В этом случае, вы даже часто не поймете, что забанены.


          1. SergeyEgorov
            22.09.2021 19:59
            +1

            Возможно мне пока просто "не повезло" и я не попадал на такие интеллектуальные контуры систем безопасности сайтов. В общем пока мои заказчики еще ни разу не обнаружили дезинформацию в распарсенных данных.


  1. remzalp
    22.09.2021 14:23

    Эх... Любил lxml, пока не встретил в первый раз на mir-kubikov.ru - расшифровка на лету. Только headless браузер из простых решений, а хотелось лишь получить табличку для вывода "наиболее выгодный набор лего по соотношению цены за кубик" :))

    var ipp = {decrypt:function() {var decrypt = new JSEncrypt(); decrypt.setPrivateKey("MIIkKQIBAAKCCAEArbPJ2


    1. Mapaxa864
      22.09.2021 22:49

      М… Теперь понятно, чего у них сайт такой тормознутый… — расшифровывают что-то там на лету…


    1. Ryav
      26.09.2021 11:07

      Так и какой самый выгодный по итогу?


      1. remzalp
        26.09.2021 15:26

        Я в итоге сдался. Selenium - не мой стек, а задача была из категории "любопытно узнать и наверное покупать не буду"


  1. 20dev20
    22.09.2021 14:48
    +2

    Да, это взять и начать парсить HTML разметку страницы. То есть, например, из <a href="https://okhlopkov.com">Cool website</a> достать ссылку. Это можно делать как простыми регулярными выражениями, так и через более умные инструменты (в питоне это BeautifulSoup4 и Scrapy) и фильтры (XPath, CSS-selectors).

    Можно и регулярками, но до поры - до времени.


  1. vedenin1980
    22.09.2021 15:25
    +2

    Все-таки это далеко не любой сайт. Тут описаны простые случаи, где по сути нет защиты.

    Бывают сайты, где стоят сложные системы обнаружения ботов/fingerprint и выдающие сложные капчи практически с первого же запроса, бывают сайты специально изменяющие html разметку или наоборот почти полностью ее убирающие. Или скажем хитро генерирующие страницу из html, так чтобы бот путался (то есть в html будет много div друг за другом, которые потом превратятся в большую таблицу, но без полноценного рейдинга сложно понять какой div в какое месте таблицу окажется). В ряде случаев дешевле всего прикрутить OCR и полноценную генерацию скриншота страницы.


    1. ohld Автор
      22.09.2021 15:34

      Да, чудищ много на пути война.

      Но кажется, что если юзер смог через свой браузер что-то открыть, то и скрипт сможет. Конечно же, стандартные хромдрайверы легко палятся. Поэтому придумали undetected chromedrivers, я кидал ссылку в соседнем комментарии.


      1. vedenin1980
        22.09.2021 16:05
        +4

        юзер смог через свой браузер что-то открыть, то и скрипт сможет.

        Проблема не только открыть, но и получить данные.
        Скажем в html может быть
        <div>name2</div><div>test12</div><div>test11</div><div>test22</div><div>name1</div><div>test21</div>

        которые в браузере превратятся в

        name1 | name2
        -----------------
        test11 | test12
        -----------------
        test21 | test22


        Но просто получить эту таблицу без полноценного рейдинга — сложно

        Опять-таки ряд сайтов (бронирования гостиниц, авиабилетов и т.п.) может выдавать мусор (устаревшие или вообще неправильные данные), если считает, что их парсит бот (причем рандомно). В результате, можно все спарсить, успокоиться, а потом окажется, что результат ничего не стоит.


      1. tempick
        22.09.2021 23:20

        Но кажется, что если юзер смог через свой браузер что-то открыть, то и скрипт сможет

        Ага, особенно когда контент доступен только авторизованному пользователю, а авторизация только через смс на номер телефона. Можно использовать виртуальные номера с получением смс через апи, только не всегда это окупается. А ещё капчу к этому прибавить…


      1. bogolt
        23.09.2021 10:00

        что за война у вас на пути?


        1. tvr
          23.09.2021 15:22
          +1

          Чудищ.


  1. staticmain
    22.09.2021 16:39
    +7

    А можно не вставлять смайлики в каждом абзаце? Такое ощущение что статья из тиктока, а не ИТ-ресурса.


    1. ohld Автор
      22.09.2021 16:43
      +1

      В тиктоке нет статей ????‍♂️


      1. MentalBlood
        22.09.2021 17:21
        -1

        Не слушайте, со смайликами реально веселей воспринимается, и это не минус, а плюс


        1. Alexey2005
          23.09.2021 03:24

          Сразу вспоминается старая шутка:
          — Проклятье! — выругался китаец, разучивая начертание вот уже десятитысячного иероглифа. — А ведь начиналось-то всё с простых смайликов!


        1. sim2q
          23.09.2021 08:41

          Да ладно вам бурчать по мелочам.
          Вот когда подпись над фото или ватермарки в фото или, О, ужас! крайний.... в тексте


    1. DEamON_M
      22.09.2021 17:53
      +5

      Даже полез проверить если ли смайлики, подумал что их удалили может позже. Уже мозг их автоматически игнорирует как мусор (чем они по факту и являются).


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. EmilLavrov
    22.09.2021 17:21

    Спасибо за актуальную информацию!


  1. kbaa
    22.09.2021 20:05

    В моем личном списке автоматизация браузера стоит на самом последнем месте, когда ничего остальное не работает, или если надо что-то разово спарсить и лень заморачиваться анализом запросов. Потому что на задачах, подразумевающих частое и масштабное обновление собираемых данных, уже всплывает такая вещь, как потребление ресурсов простым скриптом и целым (пусть даже headless) браузером. Грубо говоря - тратишь день и потом гоняешь свой код на самом дешевом VPS или тратишь пару часов и твоя ферма браузеров уже просит что-то более дорогое чтобы работать.

    За ссылку на Selenoid спасибо, любопытно. Когда я последний раз пробовал через автоматизацию браузера что-то делать, то новой фишкой в этом направлении был puppeteer xD


    1. ohld Автор
      22.09.2021 21:58

      Да, онбординг в Headless browsers не очень. Но с remote Selenium grid / cluster жизнь становится сильно проще. Один раз настроив, я теперь всегда рендерю HTML даже перед извлечением JSON из страницы - все-таки при выполнении всего положенного JS, я убежден, сильно снижается вероятность попасть в бан.


      1. kbaa
        23.09.2021 01:38

        Обычно если на сайте используется какая-то хитрая защита - она довольно быстро даёт о себе знать. Последний раз я использовал автоматизацию браузеров для сбора данных при работе с сайтами типа linkedin и instagram, всё остальное что мне попадалось - работало через обычные запросы + прокси. Хотя у меня может быть выборка нерелевантная, я последний год почти не занимаюсь подобным сбором данных, да и когда занимался активней - то тут еще была доля азарта, смогу ли я запросами эмулировать всё что нужно или всё-таки не выёживаться и просто запустить хромиум))


  1. AlexanderS
    22.09.2021 20:57

    На самом деле это проблема — сделать себе текущую работоспособную копию сайта. Иногда бывает находишь полезные разделы на некоторых ресурсах, которые бы неплохо было сохранить, чтобы посмотреть их позже, в т.ч. когда интернета нет. Есть некоторые небольшие сайты на ладан дышащие с интересной тематикой. В середине 2000-ых с такой задачей неплохо справлялись HTTrack или Teleport. Но сейчас, в 2020-ых, в плане наличия актуального готового решения с этим беда.


    1. ohld Автор
      22.09.2021 22:06

      Как мне кажется, эта проблема с каждым годом будет все менее актуальна. Особенно, когда сделают быстрый и дешевый спутниковый интернет.


      1. AlexanderS
        23.09.2021 08:30
        +2

        Проблему исчезающих сайтов это не решит. Далеко за примерами даже ходить не надо — пару лет назад buran.ru под угрозой был из-за конфликта интересов. Полноценного резерва контента у владельца не было и доступа к хостингу не было. А другой стороне на это было вообще наплевать.


  1. edogs
    22.09.2021 22:53
    +1

    Мобильные приложения сайтов зачастую выручают.
    Во-первых, запросы/ответы более «чистые».
    Во-вторых, нередко защита или отсутствует или минимальна.
    Для парсинга форумов есть смысл проверять так же на подключение к tapatalk, благо многие подключены.


  1. mjr27
    22.09.2021 23:00
    +1

    Боль современного парсинга - это cloudflare и его hcaptcha по любому чиху. Решается только тонкой подгонкой комбинации заголовков, прокси и бубна. И то не всегда.


    1. ohld Автор
      22.09.2021 23:13

      Cloudflare обходится легко) достаточно просто делать все медленно без надрывов. И с правильными настройками браузера.


      1. cry_san
        23.09.2021 05:35
        +5

        Можно конкретику?


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. raamid
    23.09.2021 01:39

    Я конечно извиняюсь, а что мешает у себя на компьютере сгенерировать пачку IPv6 адресов и с них парсить? По идее все они будут разными для сервера, который парсят. Насколько мне известно, нет четких критериев, что какой-то диапазон адресов принадлежит одному компьютеру.


    1. ohld Автор
      23.09.2021 10:36

      Не знал про такой способ, спасибо. Поизучаю, как работает IPv6 и, возможно, попробую их использовать.


    1. rogoz
      23.09.2021 15:54

      нет четких критериев, что какой-то диапазон адресов принадлежит одному компьютеру
      /64?


      1. DCNick3
        23.09.2021 16:59

        По стандарту — да, но некоторые ушлые провайдеры выдают /64 на абонента, где прячется несколько компов.


    1. raamid
      23.09.2021 21:55
      +1

      Очень хотелось бы понять мнение минусующих, а именно, вас не устраивает этический или технический аспект парсинга через IPv6? Также, приветствуется обоснование.


  1. undersunich
    23.09.2021 15:58

    Поделитесь опытом,кто нибудь пробовал парсить через распознование,например через оупен цв, интересен сам подход.Кто пробовал?


    1. vedenin1980
      23.09.2021 16:52
      +1

      OpenCV? В основном только распознавание капч или текста картинками. Там основная трудоемность в двух вещах:
      OCR всегда допускает ошибки, если в тексте описка полбеды, то в ценах или важных числовых данных иногда ошибка в 1% равносильна бесполезному набору данных.
      Во-вторых, часто. важно положение текста на странице и из картинки это получить часто сложнее (условно на одной линии слева у вас меню сайта, справа реклама, посредине важный текст, а OCR выдаст все скопом и часто нетривиально правильно распарсить данные).


    1. raamid
      23.09.2021 21:58

      Для парсинга, насколько мне известно, обычно используется Tesseract:

      https://github.com/tesseract-ocr/tesseract

      Сам я правда пока не использовал, только присматривался.


      1. ohld Автор
        24.09.2021 20:54

        Использовал его, чтобы доставать текст с мемов - работал очень плохо. На скринах вебсайтов не тестил.


      1. Saturnych
        24.09.2021 23:29

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

        И для демонстрации клиентам, что их "защита" – говно, а предыдущие разработчики взяли деньги не доделав.

        Проверка на хедлесс есть умная с проверками браузера на тру.

        В любом случае обычно вариант обхода защиты персональный для сайта.


  1. YouROK
    24.09.2021 09:51

    Если Flutter достигнет каких-нибудь высот, то и html не попарсить


    1. Saturnych
      24.09.2021 23:30

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


      1. YouROK
        25.09.2021 07:31
        -1

        В курсе как работает flutter?

        Спросить можно все, но сколько это займет ресурсов.

        Для тех кто не знает как работает flutter, он выводит в картинку содержимое, парсинг представляет собой скрин картинки и распознавание ее. А вот как парсер будет делать скролы и свайпы это другой вопрос, так как скролы происходят внутри

        Не знаю можно тут выкладывать, вот мой тестовый сайтик, попробуйте спарсить хоть что-нибудь releases.yourok.ru самому интересно


        1. Saturnych
          26.09.2021 13:43
          +2

          Это не картинка, а canvas с JS и WebGL API.

          А на Вашем сайте вся инфа из json-файлов подтягивается. Скачать всё заняло минимально времени. Т.к. кроме этих файлов другого контента там нет, то вот список (парсим JSON и получаем готовый сайт):
          https://releases.yourok.ru/releases/movies.json
          https://releases.yourok.ru/releases/4k.json
          https://releases.yourok.ru/releases/tv.json
          https://releases.yourok.ru/releases/cartoons.json
          https://releases.yourok.ru/releases/cartoons_tv.json
          https://releases.yourok.ru/releases/legends.json

          Будет время, могу сделать клона онлайн.


          1. init0
            27.09.2021 14:46

            Еще никогда Штирлиц не был так близко к провалу


            1. Saturnych
              20.10.2021 12:28

              чот YouROK пропал. скрыл свой гитхаб, удалил данные с защищенного Flutter-сайта.

              не случилось ли чего с ним? я переживаю...


  1. xPomaHx
    03.10.2021 08:21

    Есть какой то смысл запускать headless не на своей машине? по моему опыту на 1 такой браузер в среднем уходит 50 мб памяти, а больше 20-100 потоков парсить смысла нет так как не всякий хост справится даже с этим.