Скрейпинг криптовалютных новостей. Часть 1

Зачем?

Если в двух словах - прогнозирование будущего.
Для начала разберемся с понятием волатильности применительно к курсам валют (не прибегая к помощи Википедии): это величина колебаний отношения валютной пары на определенном отрезке времени.
Волатильность бывает:

Соответственно при высокой волатильности высок и профит (или наоборот потери) от спекуляции на биржах:

По сравнению с ценами фиатных валют, и драг. металлов цены криптовалют обладают в настоящее время (начало 2018-го) огромной волатильностью, что позволяет инвесторам зарабатывать (или терять) вложенный капитал:
  • большими кратностями (взлеты и падения цен в 2 и более раза особенно у молодых криптовалют)
  • динамично (можно не ждать полгода, делая долгосрочные ставки - курсы могут существенно измениться в течение нескольки часов).

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

Как же это получается - заголовки новостей пестрят сообщениями о запрете Биткоина в стране N, а Василий П. в интервью каналу M рассказывает о создании квантового компьютера, способного взламывать криптовалютные кошельки. Инвесторы (держатели криптовалют) начинают думать, что пузырь наконец то лопнул - пора продавать крипту за фиатные деньги и чем быстрее, тем лучше. А как продать быстрее? - по низкой цене конечно. Число ордеров на продажу растет, и чтобы продать свой ордер инвестор занижает цену еще сильнее - новости распространяются, к этому движению присоединяются пользователи других бирж и т.д. и т.п. - курс криптомонеты ПАДАЕТ.
Получается практически прямая зависимость между настроем новостей (слухов) и направлением движения курса валюты. Так попробуем же автоматизировать определение настроя держателей определенной криптомонеты (Ethereum), чтобы иметь возможность с большой вероятность предсказать движение курса валютной пары (к рублю).

Где

Новостных порталов в сети как космического мусора на орбите, а чтоб понять настрой конкретной статьи достаточно прочесть ее заголовок - такие критерии приводят нас на портал Яндекс.Новости https://news.yandex.ru так как:
  • он группирует новости с общей темой, выводя обобщенный заголовок
  • фильтр новостей преобразуется в GET-запрос - скрипту не придется заполнять поля формы, будет достаточно перейти на страницу по сформированному URL.

Фильтр для удобства ставим - сгруппированные сообщения за сегодняшний день, подтверждаем и копируем получившийся URL.


Как

Зайти в фоновом режиме на страницу и спарсить заголовки групп новостей нам поможет PhantomJS, работа с которым уже описывалась в статье про Инстаграм
Исследуем HTML-код страницы:

Каждый заголовок группы новостей является текстом тэга <a>, который находится внутри <H2> в CSS-классе которого присутствует строка “title”. Значит достаточно получить все элементы с тэгом H2, отфильтровать по классу и взять их атрибут innerText:
var s = "";
Array.from(document.getElementsByTagName("h2")).forEach(function(item, i, arr) {
   if (item.attributes.class.value.includes("title")) {
       s += (item.innerText + "\n");
   }
});
console.log(s);

Получаем строку из ~10 обобщенных заголовков последних новостей об Эфире разделенных символов переноса каретки. Неплохо было бы автоматизировать запуск скрипта по расписанию (раз в сутки например) и получать результат в каком нибудь мессенджере (VK например) - обернем все это в Ruby-скрипт.

Добавим в Gemfile гем phantomjs для скрейпинга Яндекс.Новостей и гем whenever для добавления запуска скрипта в cron (регулярный запуск по расписанию)
source 'https://rubygems.org' 
gem 'phantomjs' 
gem 'whenever', require: false 


Выполним команду bundle чтоб установить гемы.
В файле script.rb выведем в терминал результат выполнения скрипта на phantomjs:
require 'phantomjs'

news = Phantomjs.run("file.js") 
puts news 


file.js
var system = require('system'); 
var url = 'https://news.yandex.ru/yandsearch?text=ethereum&rpt=nnews2&grhow=clutop&wiz_no_news=1&rel=rel&within=7'; 
var agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'; 
var page = require('webpage').create();

page.open(url, function (status) { 
   page.settings.userAgent = agent; 
   page.viewportSize = { width: 1200, height: 900 }; 
   var news = page.evaluate(function() { 
       var s = ""; 
       var h2 = document.getElementsByTagName("H2"); 
       for (i=0;i<h2.length;i++) { 
           if (h2[i].attributes.class.value.indexOf("title") > -1) { 
               s += (h2[i].innerText + "\n"); 
           } 
       } 
       return s.replace(/\n$/,""); 
   }); 
   console.log(news); 
   phantom.exit(); 
});

Результат:

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