JavaScript парсеры: расширенный функционал A-Parser

Тема в разделе "Техническая поддержка", создана пользователем Forbidden, 11 дек 2016.

  1. Forbidden

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

    Некоторые факты:
    • Используя всю мощь A-Parser теперь можно написать свой парсер/регер/постер со сколько угодно сложной логикой
    • Для написания кода используется JavaScript с возможностями ES6(движок v8, обзор базовых возможностей ES6)
    • Код парсеров максимально лаконичен, позволяет сосредоточится на написании логики; работу с многопоточностью, сетью, прокси, результатами, логами и т.д. A-Parser берет на себя
    • Код можно писать прямо в интерфейсе парсера, добавив новый парсер в Редакторе парсеров, по умолчанию будет загружен простой пример, на основе которого можно быстро приступить к созданию собственного парсера
    • Доступно для лицензий Pro и Enterprise, для всех ОС кроме linux 32bit

    Примеры
    [​IMG]
    Результат:
    Код:
    https://a-parser.com/: A-Parser - парсер для профессионалов SEO
    Код парсера
    • В конструкторе задаются основные параметры парсера: собираемые результаты, формат результатов, успешный код HTTP ответа, и ограничение по размеру загружаемой страницы
    • В функции парсинга используются следующие возможности:
      • Логирование процесса работы
      • Получение данных по HTTP протоколу, указывается метод, url(запрос), дополнительно указана проверка контента и автоматическое определение кодировки страницы. Работа с прокси, количество попыток и прочие параметры задаются стандартными настройками в интерфейсе парсера
      • Проверка ответа, с помощью регулярного выражения парсится тег title и возвращается результат
    [​IMG]
    Результат:
    Код:
    buy buy baby: https://www.buybuybaby.com/ (<b>Buy Buy Baby</b>)
    buy here pay here: https://en.wikipedia.org/wiki/Buy_Here_Pay_Here (<b>Buy Here Pay Here</b> - Wikipedia)
    buy: http://www.rakuten.com/ (Rakuten.com - Computers, Electronics, Apparel, Home, Sporting ...)
    buy me a boat: http://www.azlyrics.com/lyrics/chrisjanson/buymeaboat.html (CHRIS JANSON LYRICS - <b>Buy Me A Boat</b> - A-Z Lyrics)
    buy buy baby coupon: https://www.retailmenot.com/view/buybuybaby.com (20% Off <b>buybuy BABY Coupon</b>, Free Shipping 2016 - RetailMeNot)
    buying a house: http://www.wikihow.com/Buy-a-House (How to <b>Buy a House</b>: 9 Steps (with Pictures) - wikiHow)
    buy used cars: http://www.autotrader.com/car-topics/used-car-buying.xhtml (<b>Buying</b> a <b>Used Car</b> - <b>Used Car</b> Reviews &amp; News, Compare Used ...)
    buy kratom: http://www.buykratom.us/ (<b>Buy Kratom</b> | Purveyors of Premium Kratom | Get Kratom by Kratora™)
    buy instagram followers: https://www.instabuyagram.com/instagram-followers/ (<b>Buy Followers</b> For <b>Instagram</b> Today at $1.88 | Fast &amp; Safe ...)
    buy sell trade: https://www.buysaleandtrade.com/ (Classified Ads Online that <b>Buy Sell Trade</b> | BuySaleandTrade.com)
    Код парсера
    • В конструкторе задаются названия пресетов для парсеров SE::Google::Suggest SE::Google::Suggest и SE::Google SE::Google, при этом выбор будет доступен в интерфейсе, в настройках парсера JS::Google::FromSnippets
    • В функции парсинга у нас нет вызова HTTP запросов, вместо этого мы напрямую обращаемся к существующим парсерам:
      • Получаем список подсказок по запросу
      • Затем по каждой подсказке в цикле получаем результаты первой страницы выдачи Google, сохраняем в наш результат подсказку и только первую ссылку с анкором
    [​IMG]
    Результат:
    Код:
    a.com - DA: 65; PA: 71; Spam Score: -
    y.com - DA: 42; PA: 51; Spam Score: -
    k.com - DA: 36; PA: 44; Spam Score: -
    aa.com - DA: 90; PA: 73; Spam Score: -
    z.com - DA: 49; PA: 57; Spam Score: -
    v.com - DA: 34; PA: 42; Spam Score: -
    l.com - DA: 42; PA: 51; Spam Score: -
    ab.com - DA: 57; PA: 64; Spam Score: 1
    ae.com - DA: 78; PA: 63; Spam Score: -
    
    Код парсера
    • Используем мьютекс для авторизации в один поток
    • Затем передаем сессию для всех потоков используя внешнюю переменную
    • Разбираем JSON встроенными средствами
    [​IMG]
    Результат:
    Код:
    http://www.aljazeera.com.tr: tr (Turkish)
    http://apple.com: en (English)
    https://ja.wikipedia.org: ja (Japanese)
    http://brasil.gov.br: pt (Portuguese)
    http://a-parser.com: ru (Russian)
    
    Код парсера
    • Используется HTML::TextExtractor HTML::TextExtractor для получения текста
    • Для определения языка страницы используется Яндекс Переводчик
      • Получаем ID
      • Отправляем POST запрос с полученным ID и текстом
    • Чтобы не делать дополнительные однотипные запросы, таблица соответствия кода языка и полного названия встроена в парсер
    • Есть возможность менять некоторые настройки парсера прямо из интерфейса: user agent и использование прокси для TextExtractor'а, обьем и позицию текста, отправляемого на определение
    • Ведется подробный лог работы, в результат можно вывести переменную $error, в которой будет содержаться причина если запрос был неудачным
    [​IMG]
    Код парсера
    • Данный парсер - это пример обьединения парсера поисковой выдачи и парсера текста в одном
    • Есть возможность выбрать ПС: Google или Яндекс
    • Для выбранной ПС и парсера текста можно задать собственные пресеты настроек. Тем самым можно регулировать кол-во ссылок, по которым будет парситься текст, а также настроить парсер текста (задать минимальный размер блока, юзер агент и т.п.) Пример такой настройки:
      [​IMG]
    • В результат выводится ключ, ссылка и текст. Текст никак дополнительно не чистится, можно использовать Конструктор результатов как в обычном парсере текста
    • Алгоритм работы:
      • По ключу из выбранного поисковика парсятся ссылки
      • Полученные ссылки передаются в HTML::TextExtractor для получения текста
      • С помощью this.query.add ссылки распределяются по потоках, для равномерной нагрузки

    Документация
    JS парсеры на данный момент в процессе частых изменений и добавления функционала, документация будет собираться в этом топике, после чего будет добавлена в общую документацию по A-Parser'у

    1. Общие принципы работы
    • Конструктор вызывается однократно для каждого задания
      • Необходимо обязательно задать this.defaultConf.results и this.defaultConf.results_format, остальные поля необязательны и будут принимать значения по умолчанию
      • Массив this.editableConf определяет какие настройки могут быть изменены пользователем из интерфейса A-Parser
    • Метод *parse представляет собой генератор, и на любую блокирующую операцию должен возвращать yield(это основное и единственное отличие от обычной функции)
      • Метод вызывается для каждого запроса поступившего в обработку
      • Передается query(запрос) и results(пустая заготовка для результатов)
      • Необходимо обязательно вернуть заполненый results, предварительно выставив флаг success
    2. yield this.request(method, url, queryParams, opts)
    • Получение HTTP ответа по запросу, в качестве аргументов указывается method, url, хэш с query параметрами, хэш с опциями
    • Доступные опции(opts):
      • check_content: ['<\/html>'] - массив регулярок для проверки, если проверка не проходит запрос будет повтороен с другим прокси
      • decode: 'auto-html' - автоматическое определение кодировки и преобразование в utf8, возможные значения: auto-html(на основе заголовков, тегов meta и по содержимому странички, оптимальный вариант), utf8(указывает что документ в кодировки utf8)
      • headers: {'user-agent': 'Google bot'} - хэш с заголовками, название заголовка задается в нижнем регистре, можно указать в т.ч. cookie
      • headers_order: ['cookie', 'user-agent', ...] - позволяет переопределить порядок заголовков
      • recurse: 0 - максимальное число переходов по редиректам, по умолчанию 7
      • proxyretries: 10 - число попыток, по умолчанию берется из настроек парсера
      • parsecodes: {200: 1} - перечень удачных HTTP ответов, если указан '*': 1 то все ответы удачные, по умолчанию берется из настроек парсера
      • timeout: 30 - таймаут ответа в секундах
      • do_gzip: 1 - определяет использовать ли компрессию, по умолчанию включено
      • max_size: 4096 - максимальный размер ответа в байтах, по умолчанию берется из настроек парсера
      • cookie_jar: { } - хэш с куками(формат будет разобран отдельно)
    3. yield this.parser.request
    • Получение результатов от другого парсера, в качестве аргументов указывается название парсера, его пресет, хэш override(опционально), запрос
    4. tools.*
    • Глобальный объект tools, позволяет получить доступ к встроенным функциям A-Parser'а, а также к tools.js(tools.query не доступен, необходимо использовать this.query)
    5. this.logger
    • Метод this.logger.put отображает строчку в логе
    • this.logger.doLog может использоваться как флаг для оптимизации, для случаев когда лог не ведется и аргументом к .put идет сложное выражение
    6. yield this.sleep(sec)
    • Устанавливает задержку в потоке на число секунд, может быть дробным
    7. yield this.mutex.lock(), yield.this.mutex.unlock()
    • Мютекс для синхронизации между потоками, позволяет заблокировать секцию кода для одного потока, пример в парсере JS::Rank::MOZ
    8. this.cookies.getAll(), this.cookies.setAll(cookies)
    • Получение и установка cookies
    9. this.query.add(query, maxLvl)
    • Добавление нового запроса с возможностью опционально указать максимальный уровень
    TODO:
    • Улучшения редактора(создание файлов, подсветка не сохраненных изменений)
    • Работа с файлами и аккаунтами из парсеров(для файлов использовать node-like api)
    • Экспорт\импорт парсеров

    Вступайте в Skype чат для разработчиков JS парсеров: https://join.skype.com/nMAYI9lpsJ9Z
    Первый пост будет постоянно обновляться, в комментах предлагаю вести обсуждение
     
    Последнее редактирование модератором: 6 фев 2017
    kaznokrad, Invest_it, Metroid и 8 другим нравится это.
  2. Forbidden

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

    • Добавлен пример парсинга Moz.com с авторизацией, парсер сделан на основе этого пресета
    • Добавлены описания мьютексов, работы с куками, и sleep
    • Начиная с версии 1.1.712 query заменять на хэш set который содержит все элементы запроса(запрос, первый запрос, уровень, дополнительные поля и т.п.), для доступа к запросу в текстовом виде теперь необходимо использовать set.query
     
    LmPopo и relay нравится это.
  3. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Всем добрый день!
    Закралась идея, но я в js не соображаю, но понимаю что теперь с помощью JavaScript парсера можно сделать копирку сайтов (html, картинки, css и т.д.) с полной структурой сайта. Если Forbidden или кто другой сделает, скиньте плиз персет.
     
    Forbidden нравится это.
  4. Support

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

    • Добавлен пример №4, определяющий язык страницы через Яндекс Переводчик
     
    Syrex и relay нравится это.
  5. Forbidden

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

    с версии 1.1.737 добавлен this.query.add
     
    Support нравится это.
  6. Support

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

    • Добавлен пример №5: Парсинг текстовки по ключу одним заданием
     
  7. Kreola

    Kreola Member

    Здравствуйте
    Добавьте пример работы с NET::HTTP (с получение 3-5 каких-то данных) и работой с антигейтом
    Спасибо!
     
  8. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Вопрос.
    А работает секция headers: {'cookie': 'param'} когда используется cookies.getAll и cookies.setAll (пример с авторизацией)?
    Мне в куку надо добавить доп параметр помимо авторизации (после авторизации).

    У меня не получилось это вместе использовать.

    И как посмотреть что в headers отправляться с запросом?
     
    Forbidden нравится это.
  9. Forbidden

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

    Сегодня будет обновление и пример
     
    evova и relay нравится это.
  10. Forbidden

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

    Добавлен метод установки одиночного cookie: this.cookie.set(host, path, name, value), пример:
    Код:
    this.cookies.set('ya.ru', '/', 'param', 42);
     
  11. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Обновил версию, но не получилось использовать this.cookies.set
    Зачем нужен параметр path? Они с каждым запросом меняются, как их подставлять?
    Мне просто в куку надо добавить параметры для любых запросов с любыми url.

    Еще раз вопрос.
    Для дебага как мне посмотреть что в headers отправляться с запросом? Какие куки? и др.
     
  12. Forbidden

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

    затем что куки зависят как от домена так и от пути, если на весь домен то просто надо использовать '/'

    в тестовом парсинге иконка с шестеренкой
     
  13. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Спасибо, за подсказку с шестеренкой и быстрый ответ. Но вопрос по кукам открытый.
    У меня парсер на основе примера с авторизацией, на основе MOZ т.е. cookies.getAll и cookies.setAll

    Доп устанавливаю this.cookies.set, но то что я устанавливаю не передается!!!

    вот мой код (кусок)

    this.cookies.set('ya.ru', '/', 'count', 100);

    let response = yield this.request('GET', set.query, {
    }, {
    decode: 'auto-html',
    });


    В ответе в куках только сид авторизации Cookie: SID=kaiufgjjpj8pl3rhb3jg6ddb03
    а моего нового параметра нет

    Возможно я что то делаю не так! Извините.
     
  14. Forbidden

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

    а домен то какой? ya.ru необходимо поменять на нужный домен
     
  15. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Нет не такой. Сейчас скину на почту весь пример парсера.
     
  16. evova

    evova A-Parser Enterprise License A-Parser Enterprise

    Спасибо, смотрю в книгу вижу фигу. Все работает!
     
    Support и Forbidden нравится это.

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