howTo

Scraping websites with Outwit Hub: Step by step tutorial

Some websites offer data that you can download as an Excel or CSV file (e.g., Eurostat), or they may offer structured data in the form of an API. Other websites contain useful information, but they don’t provide that information in a convenient form. In such cases, a webscraper may be the tool to extract that information and store it in a format that you can use for further analysis.

If you really want control over your scraper the best option is probably to write it yourself, for example in Python. If you’re not into programming, there are some apps that may help you out. One is Outwit Hub. Below I will provide some step by step examples of how you can use Outwit Hub to scrape websites and export the results as an Excel file.

But first a few remarks:

  • Outwit Hub comes in a free and a paid version; the paid version has more options. As far as I can tell, the most important limitation of the free version is that it will only let you extract 100 records per query. In the examples below, I’ll try to stick to functionality available in the free version.
  • Information on websites may be copyrighted. Using that information for other purposes than personal use (e.g. publishing it) may be a violation of copyright.
  • Webscraping is a messy process. The data you extract may need some cleaning up. More importantly, always do some checks to make sure the scraper is functioning properly. For example, is the number of results you got consistent with what you expected? Check some examples to see if the numbers you get are correct and if they have ended up in the right row and column.
The Outwit Hub app can be downloaded here (it’s also available as a Firefox plugin, but last time I checked it wasn’t compatible with the newest version of Firefox).

Scraping a single webpage

Sometimes, all the information you’re looking for will be available from one single webpage.

Strategy

Out of the box, Outwit Hub comes with a number of preset scrapers. These include scrapers for extracting links, tables and lists. In many cases, it makes sense to simply try Outwit Hub’s tables and lists scrapers to see if that will get you the results you want. It will save you some time, and often the results will be cleaner than when you create your own scraper.

Sometimes, however, you will have to create your own scraper. You do so by telling Outwit Hub which chunks of information it should look for. The output will be presented in the form of a table, so think of the information as cases (units of information that should go into one row) and within those cases, the different types of information you want to retrieve about those cases (the information that should go into the different cells within a row).

You tell Outwit Hub what information to look for by defining the «Marker Before» and the «Marker After». For example, you may want to extract the tekst of a title that is represented as <h1>Chapter One<h1> in the html code. In this case the Marker Before could be <h1> and the Marker After could be </h1>. This would tell Outwit Hub to extract any text between those two markers.

It may take some trial and error to get the markers right. Ideally, they should meet two criteria:

  • They should capture all the instances you want included. For example, if some of the titles you want to extract aren’t h1 titles but h2 titles, the <h1> and </h1> markers will give you incomplete results. Perhaps you could use <h and </h as markers.
  • They should capture as little irrelevant pieces of information as possible. For example, you may find that an interesting piece of information is located between <p> and </p> tags. However, p-tags (used to define paragraphs in a text) may occur a lot on a webpage and you may end up with a lot of irrelevant results. So you may want to try to find markers that more precisely define what you’re looking for.

Example: Bossnappings

Some French workers have resorted to «bossnapping» as a response to mass layoffs during the crisis. If you’re interested in the phenomenon, you can find some information from a paper on the topic summarized here. From a webscraping perspective, this is pretty straightforward: all the information can be found in one table on a single webpage.

The easiest way to extract the information is to use Outwit Hub’s preset «tables» scraper:

Of course, rather than using the preset table scraper, you may want to try to create your own scraper:

Example: Wikipedia Yellow Jerseys table

If you’re interested in riders who won Yellow Jerseys in the Tour de France, you can find statistics on this Wikipedia page. Again, the information is presented in a single table on a single website.

Again, the easy way is to use Outwit Hub’s «tables» scraper:

And here’s how you create your own scraper:

Example: the Fall band members

Mark E. Smith of the Fall is a brilliant musician, but he does have a reputation for discarding band members. If you want to analyse the Fall band member turnover, you can find the data here. This time, the data is not in a table structure. The webpage does have a list structure, but the list elements are the descriptions of band members, not their names and the years in which they were band members. So Outwit Hub’s «tables» and «lists» scrapers won’t be much help in this case – you’ll have to create your own scaper.

To extract the information:

Navigating through links on a webpage

In the previous examples, all the information could be found on a single webpage. Often, the information will be spread out over a series of webpages. Hopefully, there will also be a page with links to all the pages that contain the relevant information. Let’s call the page with links the index page and the webpages it links to (where the actual information is to be found) the linked pages.

Strategy

You’ll need a strategy to follow the links on the index page and collect the information from all the linked pages. Here’s how you do it:

  • First visit one of the linked pages and create a scraper to retrieve the information you need from that page.
  • Return to the index page and tell Outwit Hub to extract all the links from that page.
  • Try to filter these links as well as you can to exclude irrelevant links (most webpages contain large numbers of links and most of them are probably irrelevant for your purposes).
  • Tell Outwit Hub to apply the scraper (the one you created for one of the linked pages) to all the linked pages.

Two remarks:

  • Hopefully, all the linked pages have the same structure, but don’t count on it. You’ll need to check if your scraper works properly for all the linked pages.
  • In the output window, make sure to set the catch / empty settings correctly because otherwise Outwit Hub will discard the output collected so far before moving to the next linked page.

Example: Tour de France 2013 stages

We’ll return to the Tour de France Yellow Jersey, but this time we’ll look in more detail into the stages of the 2013 edition. Information can be found on the official webpage of le Tour.

Navigating through multiple pages with links

Same as above, but now the links to the linked pages are not to be found on a single index page, but a series of index pages.

Strategy

First create a web scraper for one of the linked pages, then collect the links from the index page so you can tell Outwit Hub to apply your scraper to all the linked pages. However, you’ll need one more step before you can tell Outwit Hub to apply the scraper: you’ll need to collect the links from all the index pages, not just the first one. In many cases, Outwit Hub will be able to find out by itself how to move through all the index pages.

Example: Proceedings of Parliament

Suppose you want to analyse how critically Dutch Members of Parliament have been following the Dutch intelligence service AIVD over the past 15 years or so. You can search the questions they have asked with a search query like this, which gives you 206 results, and their urls can be found on a series of 21 index pages (perhaps new questions have been asked since, in which case you’ll get a higher number of results). So the challenge is to create a scraper for one of the linked pages and then get Outwit Hub to apply this scraper to all the links from all 21 index pages.

Resources

Hoe maak je een kaart met Qgis en gegevens van het CBS


De kaart hierboven laat zien hoe ver inwoners van Amsterdamse buurten gemiddeld van dichtstbijzijnde zwembad wonen (achtergrond; klik de kaart voor een grotere versie). Hoewel de buurt- en wijkgegevens van het CBS in een gebruiksvriendelijke vorm worden aangeboden kostte het me enige moeite om er een kaart van te maken met het open sourceprogramma Qgis (informatie over Qgis hier). Voor anderen die tegen dezelfde knelpunten aanlopen zet ik hieronder stap voor stap op een rij hoe ik het heb aangepakt (ik gebruik Qgis 2.0.1 voor de Mac, wellicht dat sommige details in Windows anders werken).

De wijk- en buurtkaart

Download hier de Wijk- en Buurtkaart van het CBS en het Kadaster. Er zijn verschillende versies, voor het huidige project gebruik ik de aangepaste versie van 2011. Als het pakket is uitgepakt, open dan de relevante shapefile (in dit geval ‘buurt_2011_v2.shp’) in Qgis. Sla het project op.

Selecteer een deel van de kaart

De kaart omvat heel Nederland; in dit geval ben ik alleen in Amsterdam geïnteresseerd. Om de rest van het land te verwijderen:

  1. Rechtsklik op de kaartlaag in het venster Lagen, selecteer Open attributentabel.
  2. In het venster dat nu wordt geopend, klik linksboven de knop Bewerken aan/uitzetten.
  3. Klik op het label boven de kolom GM_NAAM om de records te sorteren op gemeentenaam.
  4. Scroll naar beneden tot je bij Amsterdam bent. Selecteer alle rijen die bij Amsterdam horen door ze links te klikken (om dit in één keer te doen: selecteer de bovenste Amsterdamse rij, hou de SHFT toets ingedrukt en selecteer de onderste Amsterdamse rij).
  5. Klik de knop Selectie omdraaien; nu is alles behalve Amsterdam geselecteerd.
  6. Klik Geselecteerde objecten verwijderen. Klik OK; vervolgens kan het even duren voordat alle niet-Amsterdamse buurten verwijderd zijn.
  7. Klik weer , bevestig dat je de aanpassingen wilt opslaan. Schrik niet als er vervolgens allemaal ERROR-meldingen in de tabel staan. Sluit het scherm. Rechtsklik in het venster Lagen de kaartlaag en selecteer Zoom naar laagextent. Nu heb je een kaart van Amsterdam.

Koppelen aan CBS-gegevens

In de Wijk- en Buurtkaart van het CBS zitten standaard al veel gegevens. In de versie van 2011 die ik gebruik zit de afstand tot het dichtstbijzijnde zwembad al opgenomen; eigenlijk is het dus niet nodig om te koppelen aan andere CBS-gegevens. Ik beschrijf toch welke stappen hiervoor nodig zijn, voor het geval zich een situatie voordoet waarin je gegevens van het CBS wil gebruiken die niet zijn opgenomen in een bepaalde versie van de Wijk- en Buurtkaart. Deze stap kan je desgewenst dus ook overslaan.

Gegevens van het CBS zijn in principe beschikbaar via Statline, maar als je gegevens voor alle buurten in Nederland zou willen downloaden dan heb je al gauw meer cellen nodig dan Statline kan verwerken. Om die reden worden de Kerncijfers Wijken en Buurten als kant-en-klare Excelbestanden aangeboden. Download hier het bestand voor het jaar dat je wil gebruiken. Op dezelfde pagina vind je ook een pdf met een toelichting op de beschikbare cijfers, waarin je ook kan opzoeken in welke jaargang bepaalde variabelen zijn opgenomen. De afstand tot het dichtstbijzijnde zwembad bijvoorbeeld zit niet in de editie 2012; vandaar dat gebruik maak van de kaart en de gegevens voor 2011.

  1. De variabele die we gaan gebruiken is AF_ZWEMB. Het Excelbestand is nogal groot; om het hanteerbaar te maken kan het geen kwaad om de variabelen (kolommen) die je niet gaat gebruiken weg te gooien. Filter vervolgens de kolom GM_NAAM op ‘Amsterdam’ en vervolgens de kolom RECS op ‘Buurt’; zo hou je alleen de gegevens van Amsterdamse buurten over.
  2. In de kolom AF_ZWEMB zitten twee cellen met ontbrekende waarden, aangeduid met een ‘x’. Daar kan Qgis niet goed mee uit de voeten, vervang ze daarom tijdelijk door een getal (bijvoorbeeld -99999). Uiteraard wel onthouden dat dat straks weer aangepast moet worden.
  3. Om de een of andere reden zit er in het bestand geen variabele die straks rechtstreeks kan worden gekoppeld aan de kaartlaag. Creëeer een nieuwe variabele die is opgebouwd uit de letters ‘BU’ plus achtereenvolgens de waarden van GM_CODE, WK_CODE en BU_CODE, dus bijvoorbeeld BU03630000 voor Burgwallen-Oude Zijde. Je kan dit doen met de functie TEKST.SAMENVOEGEN. Noem de nieuwe variabele BU_CODE2.
  4. Zorg dat er rechts naast de variable die je wil gebruiken (AF_ZWEMB) nog tenminste één kolom in de tabel zit.
  5. Kopieer alle zichtbare cellen en plak ze in een teksteditor (wellicht ten overvloede: dus niet in Word). Sla hem op als ‘cbs.csv’.
  6. Er is een kans dat je bij het importeren in Qgis vastloopt omdat Excel een komma gebruikt als scheidingsteken voor decimalen. Een simpele oplossing is om in de teksteditor met zoeken en vervangen de komma’s in punten te veranderen (denk erom dat je op die manier ook eventuele komma’s in buurtnamen verandert in punten; voor het huidige doel is dat overigens niet zo’n ramp).
  7. Klik in Qgis in de menubalk Kaartlagen -> Vectorlaag toevoegen. Klik op Bladeren om het bestand te selecteren. Selecteer bij filetype Comma separated value. Selecteer het cbs.csv-bestand en klik OK. Er is nu een nieuwe laag toegevoegd in het venster Lagen.
  8. Dubbelklik in het venster Lagen op de eerder toegevoegde kaartlaag. Klik Koppelingen. Klik op het plusteken onderin het venster. Er opent nu een nieuw venster met als titel Vectorkoppeling toevoegen. Bij de optie Koppellaag staat waarschijnlijk de naam van csv-laag geselecteerd, dat is ok. Bij Koppelveld en Doelveld moet je matchende variabelen selecteren die als sleutelvariabele worden gebruikt om de bestanden aan elkaar te koppelen. Kies voor het Koppelveld BU_CODE2 en voor het Doelveld BU_CODE. Klik daarna twee keer OK.
  9. In het venster Lagen de kaartlaag rechtsklikken en Attributentabel selecteren. Controleer of de variabelen uit het csv-bestand correct zijn gekoppeld aan de kaartlaag door helemaal naar rechts te scrollen. Als het goed is vind je daar onder meer de variabele cbs_AF_ZWEMB, plus als het goed is daar rechts naast nog tenminste één variabele.
  10. Waarschijnlijk staan de gegevens in cbs_AF_ZWEMB links uitgelijnd; dit komt doordat Qgis de geïmporteerde gegevens standaard opvat als tekst (string).
  11. Klik Bewerken aan/uitzetten. Klik Open veldberekening. Deselecteer alle rijen (knop bovenaan venster). Type een naam voor de nieuwe variabele die je gaat maken en specificeer dat het een Decimaal getal wordt met Precisie 1. Zorg dat in het vak onder Expressie de tekst ‘toreal( "XXX" )’ komt te staan, alleen dan in plaats van XXX de naam van de variabele rechts naast cbs_AF_ZWEMB (dit lijkt me een bug ofwel ik zie iets over het hoofd: om een gekoppelde variabele te selecteren moet je schijnbaar de naam van de volgende variabele invoeren). Klik OK.
  12. Als het goed is is er nu een nieuwe variabele toegevoegd. Je zou misschien verwachten dat de nieuwe waarde in helemaal rechts in de Attributentabel zou staan, maar hij staat tussen de oorspronkelijke variabelen uit de kaartlaag en de gekoppelde variabelen in. Denk er nog even om om de -99999 (of wat je ook hebt ingevuld voor de ontbrekende waarden) weer te verwijderen.

Buurten kleuren op basis van de afstand tot zwembad (choropleth maken)

Om voor elke buurt met een kleur aan te geven hoe ver de inwoners gemiddeld onderweg zijn naar een zwembad:

  1. Dubbelklik in het venster Lagen op de kaartlaag.
  2. Selecteer links Stijl.
  3. Klik Symbool wijzigen. Selecteer Standaard vulling; klik op het zwarte vlak naast Rand en klik in de kleurkiezer op wit, dan twee keer OK (dit is om de grenzen van de buurten wit te maken in plaats van zwart).
  4. Kies in de selector Gradueel, bij Kolom AF_ZWEMBAD, bij Modus ‘Mooie Grenzen’ (in andere situaties kan een andere keuze beter zijn). Kies een geschikt kleurverloop en klik Classificeren. Als je tevreden bent, klik OK.

Locaties van zwembaden toevoegen

Wat je nodig hebt is een csv-bestand met in ieder geval de coördinaten van de zwembaden. Als je de adressen hebt, kan je hier bijvoorbeeld de bijbehorende coördinaten opzoeken (om meer dan 5 adressen op te zoeken moet je een Bing Maps API key aanvragen, zie uitleg op de site).

  1. Klik in de menubalk Project -> Projectinstellingen. In het nieuwe scherm, links CRS klikken. Vervolgens bovenin het scherm de optie Gelijktijdige CRS-transformatie gebruiken aanvinken. Selecteer ‘Amersfoort / RD Nieuw’ als Ruimtelijk Referentie Systeem (dat is het CRS dat het CBS gebruikt). Klik OK.
  2. Klik in de menubalk Kaartlagen -> Tekstgescheiden kaartlaag toevoegen. Klik Bladeren om het csv-bestand te selecteren en klik OK.
  3. Stel de juiste tekstscheidingstekens in. Selecteer bij X-veld en Y-veld de variabelen met de betreffende coördinaten. Klik OK.
  4. Vervolgens moet je de CRS kiezen. Meestal zal dit WGS 84 zijn (filter op EPSG:4326). Klik OK. Als het goed is staan de locaties van de zwembaden nu op de kaart.
  5. Om ze op te maken, dubbelklik in het venster Lagen de laag met de zwembaden. Ik heb in het bestand ook een variabele opgenomen over het type zwembad, die ik hierbij gebruik. Selecteer links in het nieuwe scherm de optie Stijl. Selecteer Categorieën. Selecteer bij Kolom, ‘Type’ (of wat ook de naam is van de variabele die je wil gebruiken). Klik Classificeren. Dubbelklik in de legenda op de symbolen om ze verder op te maken. Klik desgewenst links in het venster op Labels om labels te tonen bij de zwembaden.

Kaart exporteren als pdf of afbeelding

  1. Klik op de knop Nieuwe printvormgeving (of CMD-P) en geef deze een naam.
  2. Klik bovenin het nieuwe scherm Nieuwe kaart toevoegen. Sleep vervolgens de cursor van linksboven naar rechtsonder in het open vak. Als het goed is verschijnt daar de kaart.
  3. Desgewenst klik je Nieuwe legenda toevoegen. Klik vervolgens op de plek waar de legenda moet komen.
  4. Klik naar keuze Exporteren als pdf of Opslaan als afbeelding bovenin het scherm.

Klaar.

How to create a map with Qgis and data from Statistics Netherlands (CBS)

Above is a map of Amsterdam showing the average distance people have to travel to a swimming pool. The map was created with the open source Qgis application and data from Statistics Netherlands (CBS). CBS has data at the neighbourhood level that can be used with a shapefile map they also provide. I’m not very experienced with Qgis and it took me a while to figure out how to create a map with this material. Below I describe the steps that got me there (I use Qgis 2.0.1 for Mac; perhaps things work slightly different in Windows).

CBS data and map

CBS offers data at municipality (gemeente), district (wijk) and neighbourhood (buurt) level on topics including demographics, housing, employment, companies by sector, car ownership, distance to services etc. An Excel file can be downloaded here (select the appropriate year). The same page offers a manual (pdf) specifying which variables are available for which years. To get a general idea of the available data, you could copy the text from the manual and run it through google translate. For technical information, the CBS can be contacted here.

CBS and the Kadaster also offer a map which can be downloaded here. Open the shapefile with the title starting with buurt for the neighbourhood map; wijk for the district map and gemeente for the muncipality map. For the example: below, I’ll use buurt_2011_v2.shp (i.e., the shapefile for version 2 of the 2011 neighbourhood map).

Select a part of the map

The map contains all of the Netherlands, but in this case I’m only interested in Amsterdam. In order to remove the rest of the country:

  1. Right click the map layer in the Layers window to the left; select Open attribute table.
  2. In the new window that opens, click Toggle editing mode (top left).
  3. Click the column name GM_NAME to sort the records by municipality.
  4. Scroll down until you reach records for Amsterdam. Select all rows for Amsterdam by clicking them to the left (to do this more efficiently: select the top Amsterdam row; hold SHFT and click the bottom Amsterdam row).
  5. Click the button Invert selection; now all but Amsterdam is selected.
  6. Click the button Delete selected features. Click OK (it may take a while before all the non-Amsterdam neighbourhoods are deleted).
  7. Again click Toggle editing mode; confirm that you want to save the changes to the layer (don’t be shocked if NULL shows up in all cells). Close the window. Right click the map layer in the Layers window and select Zoom to layer extent. You now have a map of Amsterdam.

.

Join with other CBS data

The Neighbourhood and District Map of the CBS contains many data as is. The 2011 version I’m using contains the distance to nearest swimming pool, so there’s strictly no need to join the map with other data. I’ll nevertheless describe the steps to do so, in case you find yourself in a situation in which you do need to add more data to the map. If you whish, feel free to skip this section.

  1. Use the CBS Excel file refered to above. The variable we’ll use is AF_ZWEMB (average distance to the nearest swimming pool in kilometers). The Excel file is rather large; in order to make it manageable you may want to delete irrelevant columns. Next, filter the column GM_NAAM (municipality) by Amsterdam. Then filter the column RECS by Buurt (neighbourhood). Now you only have the Amsterdam neighbourhoods.
  2. The column AF_ZWEMB contains two missing values represented by ‘x’. Qgis won’t handle them properly; replace them with a number (e.g. -99999). Don’t forget to change them back later.
  3. Oddly, the Excel file doesn’t contain a ready variable that can be used as a key to join the data with the map later. Create a new variable consisting of the letters ‘BU’ plus the values of GM_CODE, WK_CODE and BU_CODE (for example BU03630000 for the neighbourhood Burgwallen-Oude Zijde). You can use Excel’s CONCATENATE function for this. Name the new variable BU_CODE2.
  4. Make sure there’s at least one variable to the right of AF_ZWEMB (or add one). This needn’t contain values but must be named.
  5. Copy all visible cells to a text editor (perhaps needless to say: not MS Word). Save it as cbs.csv.
  6. Check if the file doesn’t use comma’s as decimal marks. If it does, a simple way to fix this is by using search/replace. This will also change comma’s in neighbourhood names into points, but for the current project that’s not really a problem.
  7. In Qgis, in the menu bar select Layer -> Add Vector Layer. Click Browse to select a file and indicate you’re looking for Files of type: Comma separated value. Select the cbs.csv file and click OK. A new layer has been added to the Layers window.
  8. Double click the map layer added earlier. Click Joins to the left of the new window. Click the plus-sign to the bottom of the window. A new window named Add vector join will open. At Join layer, the cbs.csv file is probably selected; that’s ok. The Join field and Target field options should contain identical variables to be used as key variable for the join. Select BU_CODE2 for Join field and BU_CODE for Target field. The click OK twice.
  9. In the Layers window, right click the map layer and select Open attribute table. Check if the variables from the cbs.csv file have been added to the right of the table. Among others, you should find the variable cbs_AF_ZWEMB there, as well as at least one more variable to the right of it.
  10. The cbs_AF_ZWEMB variable is probably left aligned, because Qgis treats joined data as character strings. Click Toggle editing mode. Deselect all rows (button to the top of the window). Click Open field calculator. Type a name for the new variable you’re going to create and specify that it’s going to be a Decimal number with Precision 1. In the box below Expression, fill out the text ‘toreal( "XXX" )’, only replace XXX with the name of the variable to the right of cbs_AF_ZWEMB (I guess this is a bug: in order to select a joined variable it appears you need to enter the name of the variable to the right of it). Click OK.
  11. You should now have added a new variable. You might expect this variable to be to the right of the table, but it’s actually between the original variables included in the map and the joined variables. Don’t forget to remove the -99999 values (or whatever you used for the missing values).

Colour neighbourhoods by distance to swimming pool (create choropleth)

In order to colour each neighbourhood by average distance to the nearest swimming pool:

  1. Double click the map layer in the Layer window.
  2. To the left of the window, select Style.
  3. Click Simple fill. Click the black box next to Border and use the colour selector to select white.
  4. In the selector, select Graduated; for Column select AF_ZWEMB and for Mode select Pretty Breaks (in other situations, other options may be preferable); select an appropriate color ramp and click Classify. If you’re satisfied, click OK.

Add locations of swimming pools

You’ll need a csv file with at least the coordinates of the swimming pools. If you have the addresses, you can geocode them here (in order to look up more than 5 addresses you’ll need to create a Bing Maps API, see explanation on the website). My file also has the names of the pools and their type (indoor or only outdoor).

  1. In the menu bar, select Project -> Project properties. In the new window, tick off Enable ‘on the fly’ CRS transformation. For CRS, select ‘Amersfoort / RD New’ (the CRS used by CBS). Click OK.
  2. In the menu bar, select Layer -> Add delimited text layer. Click Browse to select the appropriate csv file and click OK.
  3. Select the appropriate delimiters and the appropriate values for the X and Y fields. Click OK.
  4. When prompted, select the appropriate CRS. Usually, this will be WGS 84 (filter by EPSG:4326). Click OK. The locations should now be marked on the map.
  5. In order to format the markings, double click the swimming pools layer and select Style. I choose to use different symbols for indoor and outdoor pools. Select Categorized. For column, select Type (or whatever name you gave to the variable specifying the type of pool). Click Classify. Double click the symbols in the legend to further format them. If you want to add labels to the markings, click Labels to the left of the window.

Export the map as pdf or image

  1. In the menu bar, select Project -> New print composer (or use CMD-P) and give the composer a name.
  2. To the top of the new window, click Add new map. Drag the cursor from the top left to the bottom right of the empty box. The map should now appear.
  3. If you want a legend, click the button Add new legend and then click where you want it. Other buttons offer more options to add elements to the map.
  4. Either click Export as image or Export as PDF.

And you’re done.

About the swimming pools

In case you’re interested in the story behind the map: dozens of Dutch swimming pools may have to close because of the crisis and higher taxes, although it’s expected few municipalities will risk closing a pool before the city council election on 19 March. In Amsterdam, the Oost District Council will decide on swimming pools in early January. It’s expected that closing the Flevoparkbad will no longer be considered, but it’s uncertain whether a new pool will open at IJburg, as projected earlier. The map shows that residents of Waterland and IJburg (to the East and North-East of Amsterdam) have the highest average distance to the nearest swimming pool.

Script to look up the gender of Dutch first names


This script determines the gender of Dutch persons by looking up their first name in a database of the Meertens Institute. The database indicates how often the name occurred as a first name for men and women in 2010. If the name is used for women substantially more often than for men, the name will be interpreted as female – and vice versa.

The reason I wrote the script has to to with this article on how the performance of women professional road cyclists is improving. I wanted to check whether a similar trend is going on among amateur riders, more specifically, participants in the Gerrie Knetemann Classic (incidentally, the script would take Knetemann for a woman – it’s not foolproof). The results of the ride are available online, but pre-2012 editions lack information on the gender of participants. So that’s what the script was for.

Speed of participants in Knetemann Classic

The results of the analysis aren’t exactly clearcut. The number of women participants in the 150km ride varied from 36 to 46, or 5 to 8% of the participants whose gender could be determined (the percentage for 2013 was 6%). The (median) speed of women participants rose in 2013, and more so than for men, but this rather thin to speak of a trend.

«Tweet this» link (using jQuery)

Creating a «tweet this» link with jQuery turns out to be quite simple - that is, once you know how it works...

<span class='tweetThis'></span></code>
 
<code><script> jQuery(".tweetThis").append("<a href=\'https://twitter.com/intent/tweet?text="+jQuery('h1')[0].innerHTML+"&url=http%3A%2F%2Fdirkmjk.nl"+location.pathname+"\'>Tweet this<\/a>") </script>

Update - Apparently the code messes up the url if you have puncutation in it (the original url of this article - automatically generated from the title - had the quotation marks in it)

Pages