Tutorial: Scrapen met Google Spreadsheets

Datajournalist Winny de Jong maakt een serie praktische tutorials voor journalisten. Hierbij worden verschillende gereedschappen uitgelicht, die journalisten direct kunnen inzetten. Deze week: Scrapen met Google Spreadsheets.

Het snel, geautomatiseerd downloaden van informatie van een andere website wordt ‘scrapen’ genoemd. De simpelste scrapers maak je binnen een paar minuten met Google Drive. Lees in deze tutorial alles wat je moet weten over de ImportHTML functie om simpele tabellen en lijstjes te scrapen.

Deze tutorial verscheen eerder op Datajournalistiek.nl.

Voor deze scraper heb je een Google Drive account nodig. Login op Google Drive. Eenmaal ingelogd, moet je een spreadsheet maken, klik hiervoor op: “Create > Spreadsheet”. Vervolgens kun je met de volgende functie een tabel of lijst downloaden naar je spreadsheet:

=ImportHTML("URL invoegen", "table of list", 2)

Over de functie (parameters)

Zoals je kunt zien bestaat de functie uit verschillende onderdelen:

  • =

    Het is-teken is het begin van elke functie in een spreadsheet. Zonder dit startsein weet de Google Spreadsheet niet dat het om een functie gaat. Als je het is-teken weg zou halen, denkt Google Spreadsheets dat jouw functie gewoon tekst is.

  • ImportHTML

    De naam van de functie, met deze functie kun je een simpele tabel of lijst importeren in je spreadsheet.

  • (“URL invoegen”, “table”, 1)

    Dit zijn de parameters – de ingredienten – van de functie. Een functie, in dit geval een scraper, werkt pas als je alle benodigde ingredienten hebt toegevoegd. Parameters staan doorgaans tussen haakjes achter de functienaam. Meerdere parameters worden van elkaar gescheiden met komma’s.

    • “URL invoegen”

      Vul hier tussen de aanhalingstekens de link in van de pagina waarop de tabel of lijst staat die je wilt scrapen. Let op: de aanhalingstekens zijn nodig omdat het om een tekst gaat die onderdeel is van een functie.

    • “table” of “list”

      Met deze parameter geef je aan of je een tabel of lijst wilt importeren. Let op: voor de formule gebruik je het Engelse “list” of “table”. Gebruik opnieuw aanhalingstekens: ook hier gaat het om een tekst die onderdeel is van een functie.

    • 2

      Met dit getal geef je aan welke tabel of lijst je wilt importeren: de eerste, tweede of de derde? Omdat deze parameter een getal is, zijn hier geen aanhalingstekens nodig. Vaak is het een kwestie van trial & error, gewoon proberen welk nummer bij de tabel/lijst hoort die je wilt scrapen.

Voorbeeld

Het leren van een nieuwe vaardigheid als deze, gaat het beste door het te doen. Daarom een voorbeeld dat je – als je echt zelf wilt gaan scrapen – gemakkelijk kunt volgen. Stel je voor dat je van de Wikipediapagina van de Elfstedentocht de tabel met winnaars wilt scrapen – lees: geautomatiseerd importeren in een Google Spreadsheet. Een logische eerste stap is het bezoeken van de pagina die je wilt scrapen. Als je deze wikipedia-pagina over de Elfstedentocht bezoekt,  zie je dat er meerdere lijstjes en tabellen op die pagina staan.

Tabel?

Op de pagina zie je meerdere lijstjes en tabellen. Maar welke tabel – de eerste, tweede, derde, vierde, vijfde – bevat de winnaars? Welke tabel wil je scrapen? Deze vraag is minder gemakkelijk te beantwoorden dan je in eerste instantie denkt. De scraper gaat in de HTML-code van de pagina op zoek naar tabellen. In HTML-code beginnen alle tabellen met <table>, en eindigen met </table>. Maar niet alle tabellen zien er ook echt uit als een tabel: je zult zien dat bijvoorbeeld op Wikipedia pagina’s ook dingen die er uit zien als een lijstje in de HTML-code beginnen met <table>. Hierdoor herkent de scraper die lijstjes ook als tabellen; ook al denk jij daar, kijkend naar de voorkant van de site, misschien wel anders over. In de screenshot van de wikipedia-pagina van de Elfstedentocht zijn de tabellen rood omkaderd; lijstjes die onder de motorkap mogelijk ook tabellen zijn zijn omkaderd met een vraagteken.

HTML onder de motorkap

Als je dus echt zeker wilt weten of dat wat er uitziet als een tabel, ook echt een tabel is, moet je onder de motorkap kijken. Je kunt in de broncode van een webpagina opzoeken of het om een tabel of lijst gaat. Dat doe je zo:

  1. Klik je met je rechtermuisknop (of CTRL+muisklik voor Mac-computers) op de pagina die je wilt scrapen, en klik op ‘paginabron weergeven’.
  2. In het nieuwe venster dat opent zie je de HTML-code van de pagina. Op deze pagina ga je met CTRL+F (Apple-computers: appeltje+F) op zoek naar een tabel of een lijst
  3. Gebruik hiervoor een van de volgende zoekopdrachten:
    zoekopdrachten tabel of lijst

    • Gebruik ‘table’ om een tabel te vinden.
    • Gebruik ul of ol – bij voorkeur tussen haken – voor het vinden van een lijst. Hierbij staat “ul” voor ‘unordered list’ – een lijst met bullets, en “ol” voor ‘ordered list’ – een lijst met cijfers.

    Als je de tabel of lijst vindt met daarin de informatie die je wilt importeren, weet je welke parameters je moet gebruiken.

Op de Elfsteden-pagina van Wikipedia staat in de broncode op de 218e regel ‘table’, met daarna de eerste rij van de tabel met winnaars. Let op: heb je gezien dat deze tabel de vierde is, die je in de broncode tegenkomt? Nu weet je wat je bij de parameters in moet vullen.

Scrapen met Google Spreadsheets - HTML Wikipedia

Scrapen

Als je de tabel met winnaars wilt scrapen, vul je de formule in in cel A1 van je Google Spreadsheet. Zelf begon ik met deze formule:

=ImportHTML("https://nl.wikipedia.org/wiki/Elfstedentocht", "table", 1)

Eerst het is-teken met de formule, daarna de volgende parameters: de link naar de juiste wikipediapagina; daarna vul ik "table" in omdat ik weet dat ik een tabel wil scrapen; en ik gok dat het de eerste tabel is. Als je op enter drukt, scrapete Google Spreadsheets de eerste tabel van de pagina.

Met deze formule wordt er wel een tabel binnengehaald – de eerste – maar niet de juiste. Uiteindelijk probeer ik tabel 2, tabel 3, en tabel 4. Zoals gezegd: trial and error. Vooraf had ik kunnen weten dat de vierde tabel de juiste zou zijn: het was de vierde in de broncode die de namen van de winnaars bevatte. Onderstaande formule levert de tabel met winnaars op:

=ImportHTML("https://nl.wikipedia.org/wiki/Elfstedentocht", "table", 4)

Scrapen met Google Spreadsheets - Elfstedentocht winnaars

Data opslaan

Als je eenmaal een spreadsheet met een scraper hebt, dan kun je die gewoon laten staan. Mocht er een nieuwe Elfstedentocht-winnaar bij komen in de tabel, dan wordt die automatisch toegevoegd aan mijn spreadsheet. Deze koppeling heeft ook nadelen: als iemand de tabel verwijdert, dan is mijn spreadsheet leeg omdat de functie niet meer werkt. Daarom is het slim om je spreadsheet te downloaden. Dit kun je doen via het menu:

downloaden data google spreadsheet

Tips

Om mijn spreadsheets overzichtelijk te houden, scrape ikzelf een tabel of lijst per tab. Als ik data wil combineren, dan doe ik dat na het downloaden. Zo weet ik zeker dat mijn informatie bewaard blijft: ook als de tabel of lijst onverhoopt verdwijnt van de website. Bovendien kan ik zo altijd terug naar de gegevens zoals die waren op het moment dat ik de lijst of tabel scrapete.

Heb je na deze tutorial de smaak van het scrapen te pakken? Kijk dan eens naar het ebook Scraping for Journalists van datajournalist Paul Bradshaw: een toegankelijke handleiding voor als je meer wilt gaan scrapen. Veel succes!

Over Winny De Jong

Winny de Jong is datajournalist bij OneWorld, blogt over haar vak op datajournalistiek.nl, en verstuurt wekelijks een Data Nieuwsbrief. Voor SVDJ.nl maakt ze een serie praktische handleidingen voor journalisten die ook aan de slag willen met data.

Reageer

1 comments

Fraaie tip. Je moet de variabelen “https://nl.wikipedia.org/wiki/Elfstedentocht”, “table”, 4 niet met een komma-spatie maar met een ; scheiden.

Geef een reactie

*