Twitter — написание парсера твитов

Парсер твиттер iMacros

Сегодня в статье я хочу показать пример написания парсера твиттер iMacros. В статье подробно описан весь путь создания макроса. В своей работе я буду использовать только Firefox и дополнение к нему iMacros. Вся реализация будет стандартными средствами.
Суть задачи: парсинг текста твитов из выбранного аккаунта, предварительно открытого в браузере. Количество скачиваемых твитов будем регулировать с помощью установки количества повторений. Результаты извлечения сохраняются в текстовый файл.
В качестве подопытного испытуемого используется:

https://twitter.com/Twitter

Первое что делаем, это пробуем извлечь первый твитт из Twitter.

На тексте первого твитта нажимаем правой кнопкой мыши (шаг 1) и в контекстном меню выбираем «Исследовать элемент» (Inspect Element) (шаг 2). Открывается инспектор и выделяется нужный HTML-код. Чуть выше вижу следующий контейнер (блок div):

Twitter iMacros

<div class="js-tweet-text-container">

Его я и буду использовать в работе. Теперь можно написать первую команду TAG:

TAG POS=1 TYPE=DIV ATTR=CLASS:js-tweet-text-container

Сохраняем файл, и запускаем. Наблюдаем такую картину:

Twitter макрос

Границы первого твитта (а именно текстовая часть) обрамляются синией рамкой.

При помощи параметра EXTRACT добавляем извлечение текста из выбранного блока. Получаем следующую команду:

TAG POS=1 TYPE=DIV ATTR=CLASS:js-tweet-text-container EXTRACT=TXT

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

iMacros твиттер

Благодаря этому окну можно проверить что текст, содержащийся в переменной !EXTRACT, действительно соответствует первому твитту. Поскольку это так, продолжаем написание макроса для Twitter iMacros и сейчас отключаем появление всплывающего окна, для этого в начало макроса нужно добавить команду:

SET !EXTRACT_TEST_POPUP NO

Пришло время написать код для сохранения извлеченного текста (содержится в переменной !EXTRACT) в текстовый файл (* указывает на папку iMacros/Downloads, название файла — twitter.txt), воспользуемся командой SAVEAS:

SAVEAS TYPE=EXTRACT FOLDER=* FILE=twitter.txt

Я хочу немного улучшить работу макроса, для этого файл будет сохраняться под именем пользоватьеля, то есть twitter.txt превратится в Twitter.txt (согласен, пример плохой, но «Twitter» это имя аккаунта). Имя получать я буду отсюда:

Парсер твиттер iMacros

Команда для извлечения имени:

TAG POS=1 TYPE=A ATTR=CLASS:ProfileHeaderCard-nameLink<SP>u-textInheritColor<SP>js-nav EXTRACT=TXT

Записываем ее в начало макроса, в результате получаем следующий файл:

SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=A ATTR=CLASS:ProfileHeaderCard-nameLink<SP>u-textInheritColor<SP>js-nav EXTRACT=TXT
TAG POS=1 TYPE=DIV ATTR=CLASS:js-tweet-text-container EXTRACT=TXT
SAVEAS TYPE=EXTRACT FOLDER=* FILE={{!EXTRACT}}.txt

Возникает конфликт переменной !EXTRACT, т.е. вначале в нее записали имя twitter аккаунта, а потом твитт. Чтобы этого избежать введу новую переменную {{FileName}} (при помощи команды SET) и очищу переменную !EXTRACT. Код преобразуется к следующему виду:

SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=A ATTR=CLASS:ProfileHeaderCard-nameLink<SP>u-textInheritColor<SP>js-nav EXTRACT=TXT
SET FileName {{!EXTRACT}}
SET !EXTRACT NULL
TAG POS=1 TYPE=DIV ATTR=CLASS:js-tweet-text-container EXTRACT=TXT
SAVEAS TYPE=EXTRACT FOLDER=* FILE={{FileName}}.txt

Пробуем сделать что бы данная команда работала в цикле, для этого добавляем !LOOP к команде, которая извлекает твитты. В результате получится:

TAG POS={{!LOOP}} TYPE=DIV ATTR=CLASS:js-tweet-text-container

Также в конечный файл я добавлю указание версии (при помощи VERSION) и стандартную команду (впринципе она не нужна, макрос и без нее будет работать хорошо).

TAB T=1

Соберем все команды твиттер iMacros вместе:

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=A ATTR=CLASS:ProfileHeaderCard-nameLink<SP>u-textInheritColor<SP>js-nav EXTRACT=TXT
SET FileName {{!EXTRACT}}
SET !EXTRACT NULL
TAG POS={{!LOOP}} TYPE=DIV ATTR=CLASS:js-tweet-text-container EXTRACT=TXT
SAVEAS TYPE=EXTRACT FOLDER=* FILE={{FileName}}.txt

Запускаю выполнение в цикле для парсинга 100 твитов. Все команды отработали хорошо, единственное, что мне не нравится, что твиты плохо записываются в файл:

Парсер твиттер макрос

Это можно исправить используя команду EVAL и некоторые возможности JavaScript, а именно функцию trim() над строкой, результат записывается в !EXTRACT для дальнейшего сохранения:

SET !EXTRACT EVAL("var str=\"{{!EXTRACT}}\"; str.trim();")

Код для парсинга твиттер iMacros:

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=A ATTR=CLASS:ProfileHeaderCard-nameLink EXTRACT=TXT
SET FileName {{!EXTRACT}}
SET !EXTRACT NULL
TAG POS={{!LOOP}} TYPE=DIV ATTR=CLASS:js-tweet-text-container EXTRACT=TXT
SET !EXTRACT EVAL("var str=\"{{!EXTRACT}}\"; str.trim();")
SAVEAS TYPE=EXTRACT FOLDER=* FILE={{FileName}}.txt

И вот такой результат в файле:

Парсер твиттер

1 Комментарий

  1. Олег

    Отличный сайт! Очень помог разобраться в одном макросе, а я в них ни бум-бум 🙂

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *