Jednoduchý automatický web scraper pro Google Sheets a Apps Script

V konferenci pro webové analytiky teď padl dotaz, jak jednoduše sledovat v pravidelných intervalech nějaký web, vzít z něj nějakou hodnotu a zapsat si ji někam do tabulky, pro nějaké budoucí vyhodnocení, porovnání atp. K tomu samozřejmě můžete použít různé specializované nástroje typu Apify, nebo si napsat nějaký skript třeba v PHP a spouštět jej…

Uveřejněno

Autor

V konferenci pro webové analytiky teď padl dotaz, jak jednoduše sledovat v pravidelných intervalech nějaký web, vzít z něj nějakou hodnotu a zapsat si ji někam do tabulky, pro nějaké budoucí vyhodnocení, porovnání atp.

K tomu samozřejmě můžete použít různé specializované nástroje typu Apify, nebo si napsat nějaký skript třeba v PHP a spouštět jej CRONem, ale velmi dobře se k tomu dá použít i bezplatný Google Sheets a případně Google Apps Script.

Samotný Google Sheets má několik vestavěných importních funkcí, lišících se podle toho, jestli chcete data brát z (X)HTML či třeba z CSV, tedy když vám jde jen o to mít v nějaké buňce například aktuální hodnotu odstavce, který má třídu .visits, můžete do pole napsat nějakou takovouhle funkci

=IMPORTXML("https://www.example.com","//p[@class='visits]")

(jestli máte nastavené české prostředí, bude tam středník, ne čárka).

A tahle funkce vám prostě při otevření dokumentu a jednou za čas zaktualizuje hodnotu buňky a vpíše do ní ten obsah daného odstavce, viz nápověda k funkci IMPORTXML.

Ale když chcete mít i historii, provádět test v pravidelných intervalech a ještě třeba k tomu připsat datum a čas, abyste to mohli vyhodnotit, samotná funkce je vám k ničemu, i tak vám to ale Google Sheets umožní a to díky jednoduchému skriptu v Google Apps Script.

Kód nechám bez vysvětlení, věřím že i tak pochopíte co dělá, výsledek je pak zde.

/**
 * @OnlyCurrentDoc
 */
function getData() {
    var url = "http://www.bazenmb.cz/";
    var celkem = new RegExp("návštěvníků celkem: (.*?)</span>");
    var wellness = new RegExp("návštěvníků wellness: (.*?)</span>");
  
    var content = UrlFetchApp.fetch(url).getContentText();
    celkem = celkem.exec(content)[1];
    wellness = wellness.exec(content)[1];
    var all = [ new Date(), celkem,  wellness];
    Logger.log(all);
    return all;
}
function saveData() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 sheet.appendRow(getData());
}

To aby se prováděl nějaký skript pravidelně, v tomto případě každých 15 minut, docílíte pomocí tzv. spoušťěčů / triggers, momentálně se v Apps Scripts Editoru nachází pod Edit / Current project’s triggers. Tam zvolíte příslušný skript, který chcete provádět, zde je to funkce saveData(), zvolíte interval a máte hotovo.

Nové články sem přidávám porůznu, tak jestli nechcete, aby vám něco uniklo, přidejte si můj feed do RSS čtečky, sledujte můj Twitter, Facebook a LinkedIn, případně si nechte nové příspěvky posílat mailem (žádný spam!)

Komentáře

2 komentáře: „Jednoduchý automatický web scraper pro Google Sheets a Apps Script“

  1. […] pár týdny jsem tu psal článek o získávání dat z WWW stránek a ukládání dat do Google Sheets. A před pár dny se mi to hodilo, když jsem potřeboval v rámci jednoho hackathonu ukazovat na […]

  2. curilus

    Opravdu parádní řešení. Pokouším se teď o něco podobného na zaznamenávání teploty vody v Labi. Nikde jsem se k historii nedostal tak se pokouším si „dělat“ vlastní.
    IMPORTHTML jsem považoval za dobrý začátek, ale když jsem viděl co umí ten script tak cesta asi povede tudy…jen jsem amatér tak uvidíme kam se dostanu