Автоматизация рутины в OS X. Урок 6. Простейший парсинг веб-страниц

Автоматизация рутины в OS X. Урок 6. Простейший парсинг веб-страниц

В каждом из нас на уровне инстинктов есть сильнейшая потребность исследовать окружающий мир. Она помогает выживанию и способствует развитию цивилизации. Но в последние лет сто он наносит значительный вред представителям человеческого рода, не давая отрываться от экрана телевизора и заставляя бесконечно кликать на ссылках в новостной ленте. В решении последней проблемы поможет Java Script Automation.

Что мы будем делать?

«Вытащим» заголовки первого, второго и третьего уровня со всех страниц открытых в браузере и вставим их текстовый файл. Это позволит единым взором посмотреть о чем сегодня пишут новостные сайты, лишив себя возможности немедленно перейти по ссылке. С одной стороны, чтение такого файла не даст задохнуться в информационном вакууме и пропустить реально важные события («Закрыли метро», «Обменники не принимают доллары»). А с другой в несколько раз сократит время на прочтение новостных заголовков и убережет от соблазна залипнуть на час переходя от новости к новости.

Куда писать Java Script код?

  1. Открыть программу «Редактор скриптов» (Программы -> Утилиты).
    Снимок экрана 2015-10-10 в 21.02.41
  2. В верхнем меню выбрать Файл -> Новый.Снимок экрана 2015-10-10 в 21.08.11
  3. На переключателе языков выбрать JavaScript.

Снимок экрана 2015-10-10 в 21.11.37

Как получить исходный код веб-страницы?

Снимок экрана 2015-10-14 в 15.59.09Заголовки мы будем извлекать из исходного кода страницы, (который можно посмотреть нажав сочетания клавиш Command+Option+U):

// Кладем в переменную браузер Safari (аналогичный скрипт работает для Firefox и Google Chrome)
var Safari = Application("Safari");
// Кладем в переменную текстовый редактор
var textEdit = Application("TextEdit");
// Создаем в текстовом редакторе новый файл
var newDoc = textEdit.Document().make();
//Присваиваем ему имя
newDoc.name = "news.txt";
//Создаем пустую переменную для исходного кода страницы
var content = "";
//Кладем в переменную окно браузера к которому будем обращаться
var window = Safari.windows[0];
//Получаем исходный код первой вкладки окна с помощью метода source(). 
content = window.tabs[0].source();
//Записываем исходный код в текстовый файл
textEdit.documents["news.txt"].text = content;

Если бы html-теги нам были не нужны, то мы бы использовали метод text().

Как извлечь заголовки из исходного кода страницы?

Снимок экрана 2015-10-14 в 16.08.12Теперь нам нужно извлечь из огромной простыни сложно читаемых символов самую важную информацию, которая хранится в заголовках второго уровня, обозначаемых тегом «<h2>». Для этого мы будем использовать цикл for и метод split(), который преобразует строку в массив в соответствии с заданным разделителем:

// Кладем в переменные браузер и текстовый редактор
var Safari = Application("Safari");
var textEdit = Application("TextEdit");
// Создаем новый файл и присваиваем ему имя
var newDoc = textEdit.Document().make();
newDoc.name = "news.txt";
// Создаем переменные для исходника страницы и строк с заголовками
var content = "";
var headersText = "";
//Кладем в переменную окно браузера к которому будем обращаться
var window = Safari.windows[0];
//Кладем в переменную исходник веб-страницы
content = content + window.tabs[0].source();
//Создаем два служебных пустых массива, которые будем использовать для парсинга контента с помощью метода split
var contentArray = new Array();
var contentArray2 = new Array();
//Кладем в первый массив отрезки исходника от <h2> до <h2
var contentArray = content.split("<h2");
for (j = 1; j < contentArray.length; j=j+2) { 
    //Обрезаем каждый отрезок до </h2 (закрытие тега заголовка)
    contentArray2 = contentArray[j].split("</h2");
    //Прикрепляем заголовок к списку
    headersText = headersText + contentArray2[0] + "\n";
}
//Записываем все заголовки в текстовый файл
textEdit.documents["news.txt"].text = headersText;

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

><a href="http://trinixy.ru/119719-9-prichin-ne-lyubit-igromir-2015.html">9 причин не любить «Игромир 2015»</a>
><a href="http://trinixy.ru/119767-tatuirovki-poklonnikov-seriala-hodyachie-mertvecy.html">Татуировки поклонников сериала «Ходячие мертвецы» (21 фото)</a>
><a href="http://trinixy.ru/119764-pricep-karavan-iz-konstruktora-lego.html">Прицеп-караван из конструктора Lego (15 фото)</a>
><a href="http://trinixy.ru/119749-v-kanadskom-zooparke-proizoshel-pervyy-v-strane-sluchay-razmnozheniya-pand-v-nevole-4-foto.html">В Канадском зоопарке произошел первый в стране случай размножения панд в неволе (4 фото)</a>

Как проделать вышеописанное сразу с несколькими вкладками?

Снимок экрана 2015-10-14 в 16.18.13Теперь немного модифицируем наш код, чтобы он собирал заголовки сразу с нескольких новостных сайтов:

// Кладем в переменные браузер и текстовый редактор
var Safari = Application("Safari");
var textEdit = Application("TextEdit");
// Создаем новый файл и присваиваем ему имя
var newDoc = textEdit.Document().make();
newDoc.name = "news.txt";
// Создаем переменные для исходника страницы и строк с заголовками
var content = "";
var headersText = "";
//Кладем в переменную окно браузера к которому будем обращаться
var window = Safari.windows[0];
for (i=0;i<=1;i++)
{
//Кладем в переменную исходник веб-страницы во вкладке соответствующей итерации цикла
content = content + window.tabs[i].source();
//Создаем два служебных пустых массива, которые будем использовать для парсинга контента с помощью метода split
var contentArray = new Array();
var contentArray2 = new Array();
//Кладем в первый массив отрезки исходника от <h2> до <h2
var contentArray = content.split("<h2");
for (j = 1; j < contentArray.length; j=j+2) { 
    //Обрезаем каждый отрезок до </h2 (закрытие тега заголовка)
    contentArray2 = contentArray[j].split("</h2");
    //Прикрепляем заголовок к списку
    headersText = headersText + contentArray2[0] + "\n";
}
}
//Записываем все заголовки в текстовый файл
textEdit.documents["news.txt"].text = headersText;

Предыдущие публикации из цикла «Автоматизация рутины в OS X» вы можете найти по следующим ссылкам:

Знай и используй:


✅ Подписывайтесь на нас в Telegram, ВКонтакте, и Яндекс.Дзен.



Добавить комментарий