1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Пресет Быстрое создание кастомного парсера поисковой системы с помощью XPath 1.0

Пример составления кастомного парсера поисковой системы с помощью XPath

  1. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.545
    Симпатии:
    2.163
    Начиная с версии 1.1.295 в А-Парсер была добавлена поддержка XPath. Среди пользователей данная функция не пользуется большим спросом. И это довольно незаслуженно, т.к. с помощью XPath очень легко и быстро можно создавать довольно функциональные кастомные парсеры.

    В данной статье речь пойдет о парсинге поисковой выдачи rambler.ru. Аналогичным образом можно создавать парсеры и для других поисковиков.

    Итак, нам нужны браузер с поддержкой расширений и расширение для тестирования XPath (ниже будет использован Chrome и расширение XPath Helper Wizard).

    Открываем выдачу rambler.ru по любому запросу. Анализируем ссылку в адресной строке браузера - она нам нужна будет, чтобы указать ее в формате запроса. Поэксперементировав, мы видим, что ее можно сократить и http://nova.rambler.ru/search?pagelen=50&query=test возвращает 50 ссылок по запросу test.

    Далее начнем с анкоров. Включаем Инструменты разработчика, ищем на вкладке Elements нужный элемент (подсказка: очень просто это сделать, если на странице навести мышку на нужный элемент, кликнуть правой кнопкой и выбрать пункт Показать код).
    Копируем XPath для выбранного элемента.
    [​IMG]

    Открываем расширение XPath Helper Wizard и тестируем скопированный XPath.
    [​IMG]

    Мы видим, что подсветился только один анкор - тот, чей XPath мы скопировали. Теперь модифицируем запрос, чтобы захватывались все анкоры.
    [​IMG]

    Аналогичным образом получаем XPath запросы для ссылок и сниппетов:
    Код:
    анкоры: /html/body/div[1]/div[3]/div/div[*]/section/div[*]/article/h2/a
    линки: /html/body/div[1]/div[3]/div/div[*]/section/div[*]/article/h2/a/@href
    сниппеты: /html/body/div[1]/div[3]/div/div[*]/section/div[*]/article/p
    Теперь создаем задание в А-Парсере. Добавляем три Конструктора результатов, тип выбираем XPath Query и вставляем полученные выше XPath запросы. Так, как страниц в выдаче скорее всего будет несколько, то добавляем функцию Check next page и регулярное выражение для следующей страницы. Также, из-за того, что страниц будет несколько, источник в Конструкторах указываем $p1.pages.$i.data. Если на данном этапе указать формат результата $p1.serp.format('$anchor;$link;$snippet\n') то мы уже получим готовый парсер поисковой выдачи Рамблера.
    [​IMG]

    Но какой же это парсер поисковика, если он не умеет определять количество результатов в выдаче? Значит добавим такую возможность. А вместе с ней и определение, посчитал ли Рамблер запрос опечаткой, и парсинг связанных ключевых слов (related keywords).

    Примечание. Нужно учитывать, что мы парсим несколько страниц выдачи, и получать кол-во результатов, опечатку и связанные ключевые слова нужно только из первой страницы. Поэтому в качестве источника в Конструкторе результатов для этих данных используем [% pages.0.data %]

    С количеством результатов в данном случае все немного сложнее. Если мы получим для него XPath аналогично тому, как описано выше и используем его в парсере, то не получим никакого результата. А причина тому - JavaScript. Но выход есть - нужно проанализировать страницу и сделать XPath, который вернет весь JS, а потом дополнительно извлечь число.
    [​IMG]

    Как видно на скрине, мы получаем такой JS:
    Код:
    document.querySelector('.js-search-counter').innerHTML ="Найдено 948 млн страниц";
    Поэтому в формате результата нужно сделать дополнительную обработку, которая извлечет из этого число и преобразует буквенное обозначение в цифровое. Все это легко можно сделать с помощью Template Toolkit:
    Код:
    [% IF p1.totalcount.match('млрд');
        p1.totalcount = p1.totalcount.match('(\d+)').0 * 1000000000;
    ELSIF p1.totalcount.match('млн');
        p1.totalcount = p1.totalcount.match('(\d+)').0 * 1000000;
    ELSIF p1.totalcount.match('тыс');
        p1.totalcount = p1.totalcount.match('(\d+)').0 * 1000;
    ELSE;
        p1.totalcount = p1.totalcount.match('(\d+)').0;
    END %]
    С релейтедами и опечаткой все проще - получаем точно также, как и для serp, XPath запросы, и используем их в задании.
    Также иногда бывает, что Рамблер выдает каптчу. Поэтому нужно добавить Check content и предусмотреть такой вариант.

    В результате получим такой пресет:
    [​IMG]
    Код:
    eyJwcmVzZXQiOiJSYW1ibGVyIFhQYXRoIiwidmFsdWUiOnsicHJlc2V0IjoiUmFt
    YmxlciBYUGF0aCIsInBhcnNlcnMiOltbIk5ldDo6SFRUUCIsImRlZmF1bHQiLHsi
    dHlwZSI6Im92ZXJyaWRlIiwiaWQiOiJnb29kQ29kZSIsInZhbHVlIjpbMjAwXX0s
    eyJ0eXBlIjoib3B0aW9ucyIsImlkIjoiY2hlY2tOZXh0UGFnZSIsInZhbHVlIjoi
    PGEgaHJlZj1cIihbXlwiXSspXCIgY2xhc3M9XCJiLXBhZ2luZ19fbGluayBiLXBh
    Z2luZ19fbGlua19hcnJvdyBiLXBhZ2luZ19fbGlua19yaWdodFwiIiwiYWRkaXRp
    b25hbCI6eyJjaGVja05leHRQYWdlTGltaXQiOiI1In19LHsidHlwZSI6Im9wdGlv
    bnMiLCJpZCI6ImNoZWNrQ29udGVudCIsInZhbHVlIjoiY2xhc3M9XCJiLWNhcHRj
    aGFfX3RpdGxlXCIiLCJhZGRpdGlvbmFsIjp7ImNoZWNrQ29udGVudE1hdGNoVHlw
    ZSI6MH19XV0sInJlc3VsdHNGb3JtYXQiOiJbJSBJRiBwMS50b3RhbGNvdW50Lm1h
    dGNoKCdcdTA0M2NcdTA0M2JcdTA0NDBcdTA0MzQnKTtcblx0cDEudG90YWxjb3Vu
    dCA9IHAxLnRvdGFsY291bnQubWF0Y2goJyhcXGQrKScpLjAgKiAxMDAwMDAwMDAw
    O1xuRUxTSUYgcDEudG90YWxjb3VudC5tYXRjaCgnXHUwNDNjXHUwNDNiXHUwNDNk
    Jyk7XG5cdHAxLnRvdGFsY291bnQgPSBwMS50b3RhbGNvdW50Lm1hdGNoKCcoXFxk
    KyknKS4wICogMTAwMDAwMDtcbkVMU0lGIHAxLnRvdGFsY291bnQubWF0Y2goJ1x1
    MDQ0Mlx1MDQ0Ylx1MDQ0MScpO1xuXHRwMS50b3RhbGNvdW50ID0gcDEudG90YWxj
    b3VudC5tYXRjaCgnKFxcZCspJykuMCAqIDEwMDA7XG5FTFNFO1xuXHRwMS50b3Rh
    bGNvdW50ID0gcDEudG90YWxjb3VudC5tYXRjaCgnKFxcZCspJykuMDtcbkVORDtc
    bklGIHAxLm1pc3NwZWxsID09ICdub25lJztcblx0cDEubWlzc3BlbGwgPSAnMCc7
    XG5FTFNFO1xuXHRwMS5taXNzcGVsbCA9ICcxJztcbkVORCAtJV1cbiRxdWVyeS5v
    cmlnOiAkcDEudG90YWxjb3VudFxubWlzc3BlbGw6ICRwMS5taXNzcGVsbFxuJHAx
    LnNlcnAuZm9ybWF0KCckYW5jaG9yIC0gJGxpbmsgLSAkc25pcHBldFxcbicpXG4k
    cDEucmVsYXRlZC5mb3JtYXQoJyRrZXlcXG4nKVxcbiIsInJlc3VsdHNTYXZlVG8i
    OiJmaWxlIiwicmVzdWx0c0ZpbGVOYW1lIjoiJGRhdGVmaWxlLmZvcm1hdCgpLnR4
    dCIsImFkZGl0aW9uYWxGb3JtYXRzIjpbXSwicmVzdWx0c1VuaXF1ZSI6Im5vIiwi
    cXVlcnlGb3JtYXQiOlsiaHR0cDovL25vdmEucmFtYmxlci5ydS9zZWFyY2g/cGFn
    ZWxlbj01MCZxdWVyeT0kcXVlcnkiXSwidW5pcXVlUXVlcmllcyI6ZmFsc2UsInNh
    dmVGYWlsZWRRdWVyaWVzIjpmYWxzZSwiaXRlcmF0b3JPcHRpb25zIjp7Im9uQWxs
    TGV2ZWxzIjpmYWxzZSwicXVlcnlCdWlsZGVyc0FmdGVySXRlcmF0b3IiOmZhbHNl
    LCJxdWVyeUJ1aWxkZXJzT25BbGxMZXZlbHMiOmZhbHNlfSwicmVzdWx0c09wdGlv
    bnMiOnsib3ZlcndyaXRlIjpmYWxzZX0sImRvTG9nIjoibm8iLCJrZWVwVW5pcXVl
    IjoiTm8iLCJtb3JlT3B0aW9ucyI6ZmFsc2UsInJlc3VsdHNQcmVwZW5kIjoiIiwi
    cmVzdWx0c0FwcGVuZCI6IiIsInF1ZXJ5QnVpbGRlcnMiOltdLCJyZXN1bHRzQnVp
    bGRlcnMiOlt7InNvdXJjZSI6WzAsWyJwYWdlcyIsImRhdGEiXV0sInR5cGUiOiJ4
    cGF0aCIsImFycmF5Ijoic2VycCIsInhwYXRoIjoiL2h0bWwvYm9keS9kaXZbMV0v
    ZGl2WzNdL2Rpdi9kaXZbKl0vc2VjdGlvbi9kaXZbKl0vYXJ0aWNsZS9oMi9hIiwi
    dG8iOiJhbmNob3IifSx7InNvdXJjZSI6WzAsWyJwYWdlcyIsImRhdGEiXV0sInR5
    cGUiOiJ4cGF0aCIsImFycmF5Ijoic2VycCIsInhwYXRoIjoiL2h0bWwvYm9keS9k
    aXZbMV0vZGl2WzNdL2Rpdi9kaXZbKl0vc2VjdGlvbi9kaXZbKl0vYXJ0aWNsZS9o
    Mi9hL0BocmVmIiwidG8iOiJsaW5rIn0seyJzb3VyY2UiOlswLFsicGFnZXMiLCJk
    YXRhIl1dLCJ0eXBlIjoieHBhdGgiLCJhcnJheSI6InNlcnAiLCJ4cGF0aCI6Ii9o
    dG1sL2JvZHkvZGl2WzFdL2RpdlszXS9kaXYvZGl2WypdL3NlY3Rpb24vZGl2Wypd
    L2FydGljbGUvcCIsInRvIjoic25pcHBldCJ9LHsic291cmNlIjpbMCwtMSwiWyUg
    cGFnZXMuMC5kYXRhICVdIl0sInR5cGUiOiJ4cGF0aCIsInhwYXRoIjoiLy9kaXZb
    QGNsYXNzPVwiYi1zZXJwLWxpc3RcIl1bMV0vc2VjdGlvbi9zY3JpcHQiLCJ0byI6
    InRvdGFsY291bnQifSx7InNvdXJjZSI6WzAsLTEsIlslIHBhZ2VzLjAuZGF0YSAl
    XSJdLCJ0eXBlIjoieHBhdGgiLCJhcnJheSI6InJlbGF0ZWQiLCJ4cGF0aCI6Ii8v
    YVtAY2xhc3M9J2ItaGludHNfX2xpbmsnXSIsInRvIjoia2V5In0seyJzb3VyY2Ui
    OlswLC0xLCJbJSBwYWdlcy4wLmRhdGEgJV0iXSwidHlwZSI6InhwYXRoIiwieHBh
    dGgiOiIvaHRtbC9ib2R5L2RpdlsxXS9kaXZbM10vZGl2L2RpdlsxXS9iL2IvaSIs
    InRvIjoibWlzc3BlbGwifV0sImNvbmZpZ092ZXJyaWRlcyI6W10sInJ1blRhc2tP
    bkNvbXBsZXRlIjpudWxsLCJ1c2VSZXN1bHRzRmlsZUFzUXVlcmllc0ZpbGUiOmZh
    bHNlLCJydW5UYXNrT25Db21wbGV0ZUNvbmZpZyI6ImRlZmF1bHQiLCJ0b29sc0pT
    IjoiIn19

    test: 941000000
    misspell: 0
    Speedtest.net by Ookla - The Global Broadband Speed Test - http://www.speedtest.net/ - Интерактивные инструменты для проверки и анализа скорости и качества широкополосных соединений.
    «Testi.ru» — коллекция психологических тестов - http://www.testi.ru/ - Сборник тестов для мужчин и женщин на темы: характер, интеллект, интимная жизнь, деловая сфера и пр...
    Психологические тесты - http://tests.pp.ru/ - Коллекция разнообразных психологических тестов - тесты онлайн и оффлайн, популярные, юмористические и профессиональные.
    Бесплатные тесты. Онлайн тесты бесплатно, без смс... - http://www.BankTestov.ru/ - Пройти тесты онлайн или создать тест. Добро пожаловать в Банк тестов!И еще порядка 8450 специализированных тестов, предназначенных для узкого круга лиц.
    ...

    P.S. Пресет будет работать, начиная с версии 1.1.566
     
    #1 Support, 8 июн 2016
    Последнее редактирование: 8 июн 2016
    zbest, Oopssik, uomi и 10 другим нравится это.

Поделиться этой страницей