Методы для навигации

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

Walk

Метод walk используется для загрузки страниц и других документов (json, js, ical, xml, изображений) из сети интернет. Если загружаемый ресурс представлен в формате отличным от HTML или XML, диггер автоматически сконвертирует контент ресурса в XML. Это сделано для того, чтобы вы могли использовать один и тот же инструмент для извлечения данных из разнородных ресурсов.

Основные моменты метода walk:

  1. Метод может быть вызван из любого контекста
  2. Может работать с содержимым регистра, использовать значения аргументов и переменных как данные для подстановки
  3. Исполнение блока может быть зациклено до момента достижения определенного условия
  4. Может итерировать по пулу ссылок
  5. Возможно устанавливать заголовки запросов
  6. Метод может делать GET и POST запросы
  7. Если страница или документ успешно загружен, диггер переходит в страничный контекст и работает с загруженным контентом

Параметры, которые вы можете использовать в методе walk:

Параметр Описание
to Значение, определяющее какой запрос диггер должен сделать. Если значение - литерал, то будет выполнен GET запрос. Если словарь - POST запрос. При использовании литерала, вы можете использовать URL ресурса, который диггер должен загрузить. В URL допустимо использовать переменные и аргументы. Если вы хотите использовать URL из регистра, вы можете использовать зарезервированное слово value. А если вы хотите, чтобы диггер проитерировал по пулу ссылок, используйте слово pool. Для POST запроса необходимо сформировать словарь с полями, которые описаны в таблице ниже и передать его как параметр to.
headers Словарь, в который вы можете включить любые заголовки, которые будут посланы серверу с запросом. Допустимо использовать любые стандантные и нестандартные заголовки, кроме user-agent. Этот заголовок ставится автоматически, в зависимости от того, какое имя браузера вы использовали в конфигурации.
mode Включение режима забора только уникальных URL (на протяжении всех сессий диггера). Для включения этого режима, достаточно указать значение этого параметра как unique. В этом режиме диггер будет кэшировать все загруженные URL в базу данных и при следующем обращении к URL будет проверять, не загружалась ли эта страница раньше, и если загружалась - то будет пропущена. В ряде случаев этот режим помогает экономить на ресурсах.
pool Имя пула ссылок. Используется только, если в параметре to используется зарезервированное слово links и указывает диггеру какой пул ему использовать. Если этот параметр опущен, то диггер будет использовать пул по умолчанию.
repeat Специальный флаг, зацикливающий выполнение команды walk пока значение этого параметра эквивалентно значению "yes". На практике, в параметре используется переменная, которая изначально инициализируется значением "yes". В дальнейшем, при наступлении определенного события значение переменной меняется, цикл прекращается, и выполнение кода продолжается уже за пределами команды walk.
repeat_in_pool Работает аналогично опции repeat, только для итерации по пулу линков.

GET

Ниже приведены примеры GET запросов и использования параметров:

              ---
do:
# ЗАГРУЖАЕМ СТРАНИЦУ НАХОДЯЩУЮСЯ ПО УКАЗАННОМУ АДРЕСУ И ВЫПОЛНЯЕМ ЛОГИКУ ВНУТРИ БЛОКА `walk`
- walk:
    to: http://www.somesite.com/
    do:
    # НАЙДЕМ НА СТРАНИЦЕ ВСЕ ССЫЛКИ
    - find:
        path: a
        do:
        # ЗАПОЛНИМ РЕГИСТР ЗНАЧЕНИЕМ АТРИБУТА `href`
        - parse:
            attr: href
        # ЗАГРУЗИМ СТРАНИЦУ URL КОТОРОЙ НАХОДИТСЯ В РЕГИСТРЕ
        - walk:
            to: value
            do:
              
              ---
do:
# ДОБАВИМ АДРЕСА СТРАНИЦ В ПУЛ ССЫЛОК С ИМЕНЕМ `somepool`
- link_add:
    pool: somepool
    url:
    - http://www.somesite.com/page-1/
    - http://www.somesite.com/page-2/
    - http://www.somesite.com/page-3/
# НАЧИНАЕМ ПРОХОДИТЬ ПО ПУЛУ И ЗАГРУЖАТЬ СТРАНИЦЫ
# ДЛЯ КАЖДОЙ ИЗ НИХ ВЫПОЛНИМ ЛОГИКУ ВНУТРИ БЛОКА `walk`
- walk:
    to: links
    pool: somepool
    do: 
    - find:
        path: .somepath
        do:
              
            ---
do:
# ОБЪЯВИМ ПЕРЕМЕННУЮ `repeatable` И СОХРАНИМ В НЕЙ ЗНАЧЕНИЕ `yes`
- variable_set:
    field: repeatable
    value: 'yes'
# ПРЕДПОЛОЖИМ ЧТО САЙТ КОТОРЫЙ МЫ ЗАГРУЖАЕМ РАБОТАЕТ ПЛОХО, И ИНОГДА
# НЕ ВОЗВРАЩАЕТ СТРАНИЦУ В ОТВЕТ, ИЛИ ПРОСТО НЕДОСТУПЕН
# ЗАЦИКЛИМ КОМАНДУ `walk` С ПОМОЩЬЮ ПЕРЕМЕННОЙ `repeatable`
# В ЭТОМ ПРИМЕРЕ КОМАНДА `walk` БУДЕТ ПОВТОРЯТЬСЯ ДО ТЕХ ПОР ПОКА
# НА СТРАНИЦЕ НЕ НАЙДЕТСЯ БЛОК С ПУТЕМ `.somepath`
- walk:
    repeat: <%repeatable%>
    to: http://www.somesite.com/
    do:
    - find:
        path: .somepath
        do:
        # ОЧИСТИМ ПЕРЕМЕННУЮ ЧТОБЫ ПРЕРВАТЬ ЗАЦИКЛЕННЫЙ `walk`
        - variable_clear: repeatable
            
              ---
do:
# ЗАГРУЖАЕМ СТРАНИЦУ НАХОДЯЩУЮСЯ ПО УКАЗАННОМУ АДРЕСУ И ВЫПОЛНИМ ЛОГИКУ ВНУТРИ БЛОКА `walk`
- walk:
    to: http://www.somesite.com/
    # ТАК ЖЕ ЭТОМУ САЙТУ МЫ МОЖЕМ ПЕРЕДАТЬ ОПРЕДЕЛЕННЫЕ ЗАГОЛОВКИ ЗАПРОСА
    headers:
        Cookie: JSESSIONID=1234123412321; OTHERCOOKIE=<%somevar%>;
        Accept: text/xml
    do:
    - find:
        path: .somepath
        do:
              

POST

Чтобы сделать POST запрос необходимо передать в параметр to словарь с дополнительными параметрами:

Параметр Описание
post URL ресурса, на который нужно сделать POST запрос с данными, закодированными как X-WWW-FORM-URLENCODED.
json URL ресурса, на который нужно сделать POST запрос с данными, закодированными как APPLICATION/JSON.
xml URL ресурса, на который нужно сделать POST запрос с данными, закодированными как TEXT/XML. Данные могут быть переданы только в параметре payload.
graphql URL ресурса, на который нужно сделать POST запрос с данными, закодированными как APPLICATION/GRAPHQL. Данные могут быть переданы только в параметре payload.
headers Словарь, в который вы можете включить любые заголовки, которые будут посланы серверу с запросом. Допустимо использовать любые стандантные и нестандартные заголовки, кроме user-agent. Этот заголовок ставится автоматически, в зависимости от того, какое имя браузера вы использовали в конфигурации. Внимание, заголовки для POST запросов должны быть использованы именно в этом словаре, а не в основном параметре headers как для GET запросов.
data Словарь, в котором используются все поля и значения, которые нужно передать. В именах полей и значениях допустимо использование переменных и аргументов для подстановки данных. Максимальный уровень вложенности словаря - 2. Если ваши данные в формате JSON должны иметь более глубокий уровень вложенности, используйте параметр payload.
payload Строка в формате JSON/XML/GraphQL, которая передается вместо параметра data для запросов, закодированных как APPLICATION/JSON, TEXT/XML и APPLICATION/GRAPHQL.

Несколько примеров с передачей данных.

            ---
config:
  debug: 2
do:
- walk:
  to:
      post: https://mockbin.org/request
      data:
          fizz: buzz
  do:
            
Время Уровень Сообщение
2017-10-23 22:02:30:452 info Scrape is done
2017-10-23 22:02:30:436 debug Page content: <html><head></head><body><body_safe> <bodysize>9</bodysize> <clientipaddress>1.1.1.1</clientipaddress> <cookies></cookies> <headers> <accept-encoding>gzip</accept-encoding> <cf-connecting-ip>1.1.1.1</cf-connecting-ip> <cf-visitor>{&#34;scheme&#34;:&#34;https&#34;}</cf-visitor> <connect-time>2</connect-time> <connection>close</connection> <content-length>9</content-length> <content-type>application/x-www-form-urlencoded</content-type> <host>mockbin.org</host> <total-route-time>0</total-route-time> <user-agent>Surf/1.0 (Linux 3.19.0-65-generic; go1.9)</user-agent> <via>1.1 vegur</via> <x-forwarded-for>1.1.1.1, 1.1.1.1</x-forwarded-for> <x-forwarded-port>80</x-forwarded-port> <x-forwarded-proto>http</x-forwarded-proto> <x-request-start>1508785350353</x-request-start> </headers> <headerssize>556</headerssize> <httpversion>HTTP/1.1</httpversion>
<method>POST</method>
<postdata>
<mimetype>application/x-www-form-urlencoded</mimetype>
<params>
<fizz>buzz</fizz>
</params>
<text>fizz=buzz</text>
</postdata>
<querystring></querystring> <starteddatetime>2017-10-23T19:02:30.355Z</starteddatetime> <url>https://mockbin.org/request</url> </body_safe></body></html>
2017-10-23 22:02:29:405 info Retrieving page (POST): https://mockbin.org/request
2017-10-23 22:02:29:398 info Starting scrape
2017-10-23 22:02:29:382 debug Setting up default proxy
2017-10-23 22:02:29:367 debug Setting up surf
2017-10-23 22:02:29:336 info Starting digger: meta-lang-post-x-www [1862]

Обратите внимание, поскольку сервер mockbin.org отдает ответ по умолчанию в JSON, диггер сделал преобразование ответа в формат XML.

              ---
config:
    debug: 2
do:
# УСТАНОВИМ ЗНАЧЕНИЯ ПЕРЕМЕННЫХ, ПЕРВАЯ БУДЕТ ИСПОЛЬЗОВАТЬСЯ КАК ИМЯ ПОЛЯ, ВТОРАЯ КАК ЗНАЧЕНИЕ
- variable_set:
    field: field_name
    value: age
- variable_set:
    field: field_value
    value: 25
- walk:
    to:
        json: https://mockbin.org/request
        data:
            fizz: buzz
            <%field_name%>: <%field_value%>
    do:
              
Время Уровень Сообщение
2017-10-24 01:31:08:538 info Scrape is done
2017-10-24 01:31:08:523 debug Page content: <html><head></head><body><body_safe> <bodysize>26</bodysize> <clientipaddress>1.1.1.1</clientipaddress> <cookies></cookies> <headers> <accept-encoding>gzip</accept-encoding> <cf-connecting-ip>1.1.1.1</cf-connecting-ip> <cf-visitor>{&#34;scheme&#34;:&#34;https&#34;}</cf-visitor> <connect-time>1</connect-time> <connection>close</connection> <content-length>26</content-length> <content-type>application/json</content-type> <host>mockbin.org</host> <total-route-time>0</total-route-time> <user-agent>Surf/1.0 (Linux 3.19.0-65-generic; go1.9)</user-agent> <via>1.1 vegur</via> <x-forwarded-for>1.1.1.1, 1.1.1.1</x-forwarded-for> <x-forwarded-port>80</x-forwarded-port> <x-forwarded-proto>http</x-forwarded-proto> <x-request-start>1508797868503</x-request-start> </headers> <headerssize>539</headerssize> <httpversion>HTTP/1.1</httpversion>
<method>POST</method>
<postdata>
<mimetype>application/json</mimetype>
<params></params>
<text>{&#34;age&#34;:&#34;25&#34;,&#34;fizz&#34;:&#34;buzz&#34;}</text>
</postdata>
<querystring></querystring> <starteddatetime>2017-10-23T22:31:08.509Z</starteddatetime> <url>https://mockbin.org/request</url> </body_safe></body></html>
2017-10-24 01:31:08:052 info Retrieving page (POST/JSON): https://mockbin.org/request
2017-10-24 01:31:08:044 debug Variable field_value has been set to value: 25
2017-10-24 01:31:08:035 debug Variable field_name has been set to value: age
2017-10-24 01:31:08:028 info Starting scrape
2017-10-24 01:31:08:015 debug Setting up default proxy
2017-10-24 01:31:08:002 debug Setting up surf
2017-10-24 01:31:07:971 info Starting digger: meta-lang-post-json [1863]
              ---
config:
    debug: 2
do:
- variable_set:
    field: age
    value: 25
- walk:
    to:
        json: https://mockbin.org/request
        payload: '{"fizz":"buzz","age":"<%age%>"}'
    do:
              
Время Уровень Сообщение
2017-10-24 02:00:06:387 info Scrape is done
2017-10-24 02:00:06:374 debug Page content: <html><head></head><body><body_safe> <bodysize>26</bodysize> <clientipaddress>1.1.1.1</clientipaddress> <cookies></cookies> <headers> <accept-encoding>gzip</accept-encoding> <cf-connecting-ip>1.1.1.1</cf-connecting-ip> <cf-visitor>{&#34;scheme&#34;:&#34;https&#34;}</cf-visitor> <connect-time>1</connect-time> <connection>close</connection> <content-length>26</content-length> <content-type>application/json</content-type> <host>mockbin.org</host> <total-route-time>0</total-route-time> <user-agent>Surf/1.0 (Linux 3.19.0-65-generic; go1.9)</user-agent> <via>1.1 vegur</via> <x-forwarded-for>1.1.1.1, 1.1.1.1</x-forwarded-for> <x-forwarded-port>80</x-forwarded-port> <x-forwarded-proto>http</x-forwarded-proto> <x-request-start>1508799606293</x-request-start> </headers> <headerssize>540</headerssize> <httpversion>HTTP/1.1</httpversion>
<method>POST</method>
<postdata>
<mimetype>application/json</mimetype>
<params></params>
<text>{&#34;fizz&#34;:&#34;buzz&#34;,&#34;age&#34;:&#34;25&#34;}</text>
</postdata>
<querystring></querystring> <starteddatetime>2017-10-23T23:00:06.298Z</starteddatetime> <url>https://mockbin.org/request</url> </body_safe></body></html>
2017-10-24 02:00:05:098 info Retrieving page (POST/JSON): https://mockbin.org/request
2017-10-24 02:00:05:089 debug Variable age has been set to value: 25
2017-10-24 02:00:05:081 info Starting scrape
2017-10-24 02:00:05:069 debug Setting up default proxy
2017-10-24 02:00:05:062 debug Setting up surf
2017-10-24 02:00:05:035 info Starting digger: meta-lang-post-payload [1864]

В следующей части мы рассмотрим метод find. Он используется для навигации по DOM структуре загруженного документа.