v Blog

Parsování obsahu webu javascriptem

Kamarádku nedávno napadlo, že ochutná všechna česká vína :). Našla si web, kde je poměrně rozsáhlý seznam vinařství, který jsem ji pomohl stáhnout do excelové tabulky. Pár lidí zajímalo, co jsem použil, tak to tu popíšu.

Pracuji nejvíc v PHP, ale tam není práce s DOMem moc pohodlná, takže jsem si řekl, že musí existovat něco javascriptového, když teď javascript tak frčí. Mám nějakou zkušenost s gruntem, takže jsem zabrousil na npmjs.com, kde jsou balíčky pro NodeJS (server side javascript, který má přístup ke zdrojům systému, jako např. filesystém).

Hledal jsem něco, co by mi umožňovalo k prvkům DOMu přistupovat tak jednoduše, jako v jQuery (které také dobře znám). A můj odhad, že něco takového musí existovat byl správný, hned jsem našel Cheerio.

První verze scriptu prochází adresář vinařů a na výstup píše obsah odstavce, ve kterém je název a adresa vinařství:

var $ = require('cheerio')
var request = require('request');

function parsePage(url) {
    request(url, function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var parsedHTML = $.load(html)
        parsedHTML('.search-results .box p').map(function(i, p) {
          p = $(p)
          console.log(p.text())
        })
      }
    });
}

var start = 0;
while (start <= 750) { var url = 'http://www.wineofczechrepublic.cz/nasi-vinari/adresar-vinaru.html'; if (start > 0) {
        url += '?start='+start;
    }
    parsePage(url);
    start = start + 50;
}

Postupně jsem kód měnil a vylepšoval, např. jsem použil sync-request, aby se stránky načítaly synchronně po sobě a měl jsem vinaře podle abecedy. Dodělal jsem výpis ve formátu pro CSV. Na provozovatele webu s adresářem vinařů jsem byl hodný, takže jsem si stránky nastahoval a pak už je používal lokálně, abych mu nevytěžoval server a spuštění při ladění jsem měl rychlejší.
Další verze kódu asi nemá cenu ukazovat, když něco takového budete zkoušet, rychle vygooglíte, co potřebujete.

NodeJS mi tedy přijde na podobné věci moc pěkný nástroj, v kombinaci s unixovým přesměrováním do souboru jsem ani nemusel psát ukládání do CSV, ve výsledku stačilo:

node parse.js > vinari.csv
Líbilo se? Tak to sdílej, dík:)Share on FacebookTweet about this on TwitterEmail this to someone

Komentáře

Komentář