Методы для навигации
Навигация используется для перехода на различные страницы вебсайта, для выполнения запросов на загрузку различных документов и файлов, а также для перехода по DOM структуре загруженного документа.
Walk
Метод walk используется для загрузки страниц и других документов (json, js, ical, xml, изображений) из сети интернет. Если загружаемый ресурс представлен в формате отличным от HTML или XML, диггер автоматически сконвертирует контент ресурса в XML. Это сделано для того, чтобы вы могли использовать один и тот же инструмент для извлечения данных из разнородных ресурсов.
Основные моменты метода walk:
- Метод может быть вызван из любого контекста
- Может работать с содержимым регистра, использовать значения аргументов и переменных как данные для подстановки
- Исполнение блока может быть зациклено до момента достижения определенного условия
- Может итерировать по пулу ссылок
- Возможно устанавливать заголовки запросов
- Метод может делать GET и POST запросы
- Если страница или документ успешно загружен, диггер переходит в страничный контекст и работает с загруженным контентом
Параметры, которые вы можете использовать в методе 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>{"scheme":"https"}</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>{"scheme":"https"}</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>{"age":"25","fizz":"buzz"}</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>{"scheme":"https"}</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>{"fizz":"buzz","age":"25"}</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 структуре загруженного документа.