Floris Luiten

Close-up van een blonde jongeman met bril die en kop koffie drinkt in een cafe

Floris Luiten is programmeur bij u0192. Hij houdt van programmeren, cijfers, logica en het bestuderen van het menselijk gedrag. Op deze website laat hij zich over deze en nog meer onderwerpen uit. Wil je weten wat Floris nu denkt? Volg hem via Twitter (@florisl).
Meer informatie over Floris Luiten

Twitter in Python

Je kent 't wel: Het is zondagmiddag, de regen tikt zachtjes tegen de ruiten en je vraag je af of de zomer ooit nog komt. Volgens mij is het weer het grootste onderwerp van gesprek in de wachtkamer op die momenten waar anders ongemakkelijke stiltes zouden vallen. Wij Hollanders houden sowieso wel van 't discussiëren over 't weer - het is altijd een bron van ergenis ("De zon is te fel", "waar is de zon", "waarom valt de regen precies op 't moment dat ik met m'n pas geföhnde haar Fikkie moet uitlaten"). De belangrijkste reden dat wij er zo graag over praten is dat we er niets aan kunnen doen, maar niemand zich aangevallen voelt als we 't becommentariëren.

Waar heb je nu de grootste bron van kletspraat (small talk, babilado)? Juist, op 't internet natuurlijk! Welk medium op internet biedt er nu een beter platform voor nutteloze uitspraken over niet ter zake doende onderwerpen waar niemand om heeft gevraagd? Juist, Twitter ("kleppen" naar het geluid van de vogeltjes) natuurlijk! En wat moet je als programmeur nu met deze informatie doen? Weer goed! Scrapen natuurlijk!

Twitter en zoeken

Via de website van twitter kun je door middel van zoekopdrachten goed bijhouden wat er allemaal over 'n bepaald onderwerp gezegd word. Zo kun je als zoekwoord "twitter" invoeren om te zien welke mensen op Twitter praten over Twitter.
Nu op zoek naar de tweets over 't weer, het Nederlandse weer wel te verstaan. Je zou als zoekwoord simpelweg weer kunnen invoeren, maar dan krijg je een hoop resultaten die helemaal niets met 't weer te maken hebben. Twitter snapt het woord weer nl niet, maar laat alleen tweets zien waar dit woord in voor komt. Je krijgt op die manier ook tweets waar iemand het woord weer gebruikt in een andere context:

Zoeken op "weer" in Twitter

Zoals je ziet twittert 'Politie Nederland' helemaal niet over het weer. Dit zoekwoord an sich is dus te "breed" om een goed beeld te krijgen over mensen die over het weer Twitteren. Als je zoekt op het weer kom je tweets tegen waar beide woorden in staat, maar niet per se achter elkaar. Als je echter het zoekwoord tussen aanhalingstekens zet krijg je alleen tweets waar "het weer"  achter elkaar staat.

Je kunt echter ook prima over 't weer praten zonder dat er het weer in je tweet staat: "Wat een mooie dag vandaag, de temperatuur stijgt tot 20 graden!". Hoe gaan we dit dan aanpakken? Nou, simpelweg door het gebruik van het woord OR in de zoekopdracht. Op deze manier kun je meerdere zoekopdrachten aan elkaar koppelen om op meerdere woorden te zoeken. Hoewel de volgende zoekquery verre van perfect is geeft deze toch een aardig beeld van de mensen die Twitteren over het weer:

temperatuur OR "mooi weer" OR "slecht weer" OR "geen weer" OR zon OR bewolkt OR hagel OR "het weer"\
OR "beter weer" OR vakantieweer OR fietsweer OR "snert weer" OR zomer OR winter OR herfst OR lente

Echter, als je deze zoekquery gebruikt zal het gelijk opvallen dat er ook veel Tweets tussen komen te staan die niet op het het Nederlandse weer slaan, dit omdat het woord winter ook in het Engels gebruikt word. Dat is niet wat we willen, we willen alleen Nederlandse tweets! Moeten we nu 't woord winter niet meenemen? Nee, omdat je simpelweg lang:nl kunt toevoegen aan je zoekopdracht. Daardoor worden alleen Tweets getoond waarvan Twitter denkt dat ze in 't Nederlands zijn geschreven. Handig!

Heel leuk, die zoekopdrachten op je scherm, maar als je iets met die gegevens wilt gaan doen is dit natuurlijk niet voldoende. Je zou natuurlijk elke Tweet middels copy/paste in een excel-bestandje gooien, maar ga daar maar 'ns aan staan! Nee, dat moet handiger kunnen en dat kan ook handiger!

De Twitter API

Als je iets wilt doen met Twitter gegevens bezoek je eerst de Twitter Developers pagina. Er zijn verschillende manieren om met Twitter te werken, maar voor ons de meest interessante is de GET search, waarmee je door middel van een eenvoudige HTTP request zoekopdrachten kunt uitvoeren. Als je de pagina hebt gelezen - of je bent 'n snelle leerling - dan zie je aan de volgende Python code al snel hoe 't werkt:


import httplib, urllib

param = {'q' : '"het weer"', 'result_type' : 'recent', 'rpp' : 100}
# Or, search for "het weer", only recent Tweets and max 100

conn = httplib.HTTPConnection('search.twitter.com')

conn.request('GET', '/search.atom?' + urllib.urlencode(param))

response = conn.getresponse()

data = response.read()
conn.close()

print data

Voer maar uit, ga je gang! Ja, met die 8 regels code kun je zelf zoekopdrachten uitvoeren via Python op Twitter en krijg je een mooi XML bestand terug. Super toch? Wat er nog rest is om deze XML file te parsen om een net Python object te krijgen. Laten we voor 't gemak minidom gebruiken om XML te interperteren en een list als opslag:


def XMLextractTextNode(domObject, elementName):
try:
return domObject.getElementsByTagName(elementName)[0].firstChild.nodeValue
except:
return ''

import xml.dom.minidom

dom = xml.dom.minidom.parseString(data)

for feed in dom.getElementsByTagName('feed'):
for entry in feed.getElementsByTagName('entry'):
tweet = []
tweet.append(XMLextractTextNode(entry, 'id').split(':')[2])
tweet.append(XMLextractTextNode(entry, 'title'))
tweet.append(XMLextractTextNode(entry, 'published'))
tweet.append(XMLextractTextNode(entry, 'twitter:geo'))
tweet.append(XMLextractTextNode(entry, 'twitter:source'))
tweet.append(XMLextractTextNode(entry, 'twitter:lang'))
tweet.append(XMLextractTextNode(entry, 'name'))

print tweet

Et voilà! Je eigen in Pyton geschreven Twitter-search-engine... Nou, dat is misschien wat overdreven, maar je kunt er wel leuke dingen mee doen. Wat dacht je van 't opslaan van de tweets in een database voor analyse? Wees dan slim en gebruik de "alternate" link in de XML om de vervolg tweets op te halen.

Wordt vervolgd...

Bekijk andere blog posts