Итераторы

Итератор по датам

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

Параметр Описание
type Константа, определяющая тип итератора, имеет значение date.
start Дата начала периода итератора в формате YYYY-MM-DD, если отсутствует, используется текущая дата (опционально).
end Дата окончания периода итератора в формате YYYY-MM-DD, если отсутствует, используется период (опционально).
period Длительность периода в днях, если отсутствует, устанавливается длительность в 60 дней (опционально).
interval Интервал в днях между итерациями, например, если вы хотите получить все даты из периода, вы должны выставить интервал равный 1, если же вам нужны даты раз в неделю, выставьте интервал равный 7. Если интервал не указан явно, будет использоваться значение по умолчанию равное 1 (опционально).
template Шаблон, используемый для форматирования значений в полях start_date и end_date наборов данных, сформированных итератором (опционально).

В таблице ниже, вы можете познакомиться со всеми возможными тегами, которые могут быть использованы в темплейте и примеры их использования:

Тег Описание Темплейт Значение
%a аббревиатура дня недели, например Mon или Fri %a, %d %B Fri, 20 February
%A день недели в полном написании, например Monday или Friday %A, %d %B Friday, 20 February
%b аббревиатура месяца, например Feb или Sep %A, %d %b Friday, 20 Jun
%B полное наименование месяца, например February или September %A, %d %B Friday, 20 June
%C номер столетия, принимает значения от 00 до 99 %С/%y 20/17
%d день месяца, принимает значения от 01 до 31 %Y-%m-%d 2017-10-01
%D предустановленый темплейт, аналогичен темплейту %m/%d/%y %D 05/08/17
%e день месяца, принимает значения от 1 до 31 %e %B 5 January
%F предустановленый темплейт, аналогичен темплейту %Y-%m-%d %F 2017-10-01
%g двухзначный номер года в соответствии со стандартом ISO-8601:1988 %g 17
%G четырехзначный номер года в соответствии со стандартом ISO-8601:1988 %G 2017
%h то же что и %b% %A, %d %h Friday, 20 Jun
%H час в 24-часовой системе, принимает значения от 00 до 23 %H:%M:%S 08:35:26
%I час в 12-часовой системе, принимает значения от 01 до 12 %H:%M:%S 08:35:26
%j порядковый день в году, принимает значения от 1 до 366 Сегодня %j день в году Сегодня 183 день в году
%k час в 24-часовой системе, принимает значения от 0 до 23 %k часов %M минут 8 часов 35 минут
%l час в 12-часовой системе, принимает значения от 1 до 12 %l часов %M минут 8 часов 35 минут
%m порядковый номер месяца, принимает значения от 01 до 12 %Y-%m-%d 2017-10-01
%l минуты, принимает значения от 00 до 59 %l часов %M минут 8 часов 35 минут
%n символ переноса строки %Y%n%m 2017\n10
%p значение AM или PM в зависимости от времени, используется при указании времени в 12-часовом формате %I%p 8AM
%P значение am или pm в зависимости от времени, используется при указании времени в 12-часовом формате %I%P 8am
%r то же что и %I:%M:%S %p %r 04:12:37 PM
%R то же что и %H:%M %R 22:35
%s временная метка Unix, выражает количество секунд прошедших с начала эпохи (1 января 1970) %s 1506867213
%S секунды, принимает значения от 00 до 59 %H:%M:%S 08:35:26
%t символ табуляции %Y%t%m 2017\t10
%T то же что и %H:%M:%S %T 08:35:26
%u порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) Сегодня %u день недели Сегодня 5 день недели
%U номер недели в году, в случае когда неделя начинается с вокресенья, принимает значения от 00 до 53 Шла %U неделя Шла 23 неделя
%V номер недели в году по ISO стандарту, в случае когда неделя начинается с понедельника, принимает значения от 01 до 53. Если в неделе, в которой находится 1 января, содержится 4 и более дней из нового года, эта неделя считается первой неделей нового года, в противном случае - последней неделей прошедшего года. Шла %V неделя Шла 23 неделя
%w порядковый номер дня недели от 0 (воскресенье) до 6 (суббота) Сегодня %w день недели Сегодня 5 день недели
%W номер недели в году, в случае когда неделя начинается с понедельника, принимает значения от 00 до 53 Шла %W неделя Шла 23 неделя
%y Двухзначный порядковый номер года %m/%d/%y 10/01/17
%Y Четырехзначный порядковый номер года %Y-%m-%d 2017-10-01
%z поправка ко времени относительно времени UTC. Выводится в формате +HHMM или -HHMM, где + означает восточнее GMT, - западнее, HH - количество часов, MM - количество минут. %z +0300
%Z аббревиатура временной зоны %Z MSK
%+ то же что и %a %b %e %H:%M:%S %Z %Y %+ Mon Sep 20 13:24:55 MSK 2017
%% символ % %Y%%%m 2017%10

Если вы не используете шаблон, start_date и end_date будут выведены согласно ISO стандарту. Кроме этих двух аргументов в набор также будут добавлены и другие аргументы, которые могут быть весьма полезны в различных ситуациях:

Аргумент Описание
start_date дата начала интервала, в формате заданном темплейтом или согласно ISO стандарту
end_date дата конца интервала, в формате заданном темплейтом или согласно ISO стандарту
start_year год начала интервала, в формате %Y (YYYY)
end_year год конца интервала, в формате %Y (YYYY)
start_yr год начала интервала, в формате %y (YY)
end_yr год конца интервала, в формате %y (YY)
start_month месяц начала интервала, в формате %m (MM)
end_month месяц конца интервала, в формате %m (MM)

Пример итератора по датам:

              iterator:
- type: date
  # ИНТЕРВАЛ ИТЕРАЦИЙ В 2 ДНЯ
  interval: 2
  # ПЕРИОД МЕЖДУ ДАТОЙ НАЧАЛА (В ДАННОМ СЛУЧАЕ ТЕКУЩЕЙ ДАТОЙ, ТАК КАК ДАТА НАЧАЛА ОТСУТСВУЕТ) И ОКОНЧАНИЯ 10 ДНЕЙ
  period: 10
  # ТЕМПЛЕЙТ ДЛЯ АРГУМЕНТОВ `start_date` И `end_date`
  template: '%B %d %Y'
              

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

              [
    {
      "start_date": "October 01 2017", "end_date": "October 02 2017",
      "start_year": "2017", "end_year": "2017",
      "start_yr": "17", "end_yr": "17",
      "start_month": "10", "end_month": "10"
    },
    {
      "start_date": "October 03 2017", "end_date": "October 04 2017",
      "start_year": "2017", "end_year": "2017",
      "start_yr": "17", "end_yr": "17",
      "start_month": "10", "end_month": "10"
    },
    {
      "start_date": "October 05 2017", "end_date": "October 06 2017",
      "start_year": "2017", "end_year": "2017",
      "start_yr": "17", "end_yr": "17",
      "start_month": "10", "end_month": "10"
    },
    {
      "start_date": "October 07 2017", "end_date": "October 08 2017",
      "start_year": "2017", "end_year": "2017",
      "start_yr": "17", "end_yr": "17",
      "start_month": "10", "end_month": "10"
    },
    {
      "start_date": "October 09 2017", "end_date": "October 10 2017",
      "start_year": "2017", "end_year": "2017",
      "start_yr": "17", "end_yr": "17",
      "start_month": "10", "end_month": "10"
    }
]
              

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

Пример использования итератора в диггере:

              ---
config:
    debug: 2
    agent: Firefox
iterator:
    type: date
    start: '2017-10-01'
    period: 4
    interval: 2
    template: '%Y-%m-%d'
do:
- walk:
    to: https://www.diggernaut.com/sandbox/meta-lang-object-ru.html?from=<%start_date%>&to=<%end_date%>
    do:
              
Время Уровень Сообщение
2017-10-23 14:23:41:335 info Scrape is done
2017-10-23 14:23:41:321 debug Page content: <!DOCTYPE html><html lang="ru"><head> <meta charset="UTF-8"/> <title>Diggernaut | Мета-язык | Пример объекта</title> </head> <body> <h1>Заголовок-1</h1> <p>Пример описания чего-то там.</p> </body></html>
2017-10-23 14:23:41:166 debug Referers: Referer: https://www.diggernaut.com/sandbox/meta-lang-object-ru.html?from=2017-10-01&to=2017-10-02
2017-10-23 14:23:41:158 debug Referer: https://www.diggernaut.com/sandbox/meta-lang-object-ru.html?from=2017-10-01&to=2017-10-02
2017-10-23 14:23:41:150 info Retrieving page (GET): https://www.diggernaut.com/sandbox/meta-lang-object-ru.html?from=2017-10-03&to=2017-10-04
2017-10-23 14:23:41:138 debug Page content: <!DOCTYPE html><html lang="ru"><head> <meta charset="UTF-8"/> <title>Diggernaut | Мета-язык | Пример объекта</title> </head> <body> <h1>Заголовок-1</h1> <p>Пример описания чего-то там.</p> </body></html>
2017-10-23 14:23:40:185 info Retrieving page (GET): https://www.diggernaut.com/sandbox/meta-lang-object-ru.html?from=2017-10-01&to=2017-10-02
2017-10-23 14:23:40:178 info Starting scrape
2017-10-23 14:23:40:166 debug Setting up default proxy
2017-10-23 14:23:40:153 debug Setting up surf
2017-10-23 14:23:40:125 info Starting digger: meta-lang-iterator [1859]

Далее мы рассмотрим итераторы типа csv.