Terug naar blog

Twitter-data extraheren met Python

Twitter-data extraheren met Python

Twitter is niet zomaar een uitgebreide nieuwsbron, het is veruit een van de beste steekproeven van de wereld’s gedachten. Met meer dan 330 miljoen actieve gebruikers is het een van de top-platforms waar mensen graag hun gedachten delen. Twitter-data kan voor verschillende doeleinden worden gebruikt, zoals onderzoek, consumenteninzichten, demografische inzichten, en nog veel meer.

Het primaire doel van deze tutorial is dan ook om je te leren hoe je een steekproef van Twitter-data krijgt die relevant is voor je project of bedrijf.

Zorg ervoor dat je al deze variabelen bij de hand hebt voordat je verdergaat:

  1. Consumer Key
  2. Consumer Secret
  3. Access Token
  4. Access Token Secret

Als je wilt weten hoe je de bovengenoemde gegevens kunt verkrijgen, lees dan deze blogpost geschreven door mijn collega Dattatray Upase.

Laten we nu gaan coderen!

De invoervariabelen definiëren

Eerst moet je een aantal van de globale variabelen definiëren die je nodig hebt voor het programma:

Ik importeer ‘sys’ om opdrachtregelargumenten te krijgen, omdat ik mogelijk trefwoorden, startdatum of einddatum wil wijzigen. Voor de taal heb ik Engels gekozen, maar misschien wil je controleren welke andere talen worden ondersteund. De resultaten worden opgeslagen in ‘data’ aan het einde.

Hierdoor zou een typisch gebruik van het script er als volgt uitzien:

python script.py start_date end_date keyword

Toegang krijgen tot de Twitter-API
Twitter staat het gebruik van hun API toe via een oauth2-autorisatieframework. Ze bieden de documentatie op hun website waarmee het filteren van tweets kan worden gedaan. Het bovenstaande stukje code implementeert dit voor je.

De variabele req_count is het aantal keren dat ik de API heb gebruikt bij de uitvoering van mijn programma. Ik krijg de volgende foutmelding met de gegeven code:

TypeError: Unicode-objects must be encoded before hashing

Om dit te voorkomen, verander ik post_body=”” naar post_body=b”” en dat lost het probleem op.

Twitter API-gebruik en -referentie

Het is tijd om de API-URL in te stellen om de Twitter-data op te halen. Ik gebruik de parameter min_faves. Hier is de uitleg van de URL en enkele optimalisatietrucs:

‘min_faves’ wordt gebruikt om het minimum aantal favorieten in te stellen dat een tweet in de data moet hebben. Het is een zeer nuttige functie, maar deze wordt niet vermeld in de Twitter API-documentatie.

‘q’ vertegenwoordigt de zoekopdracht of de trefwoorden die u wilt invoeren. Hier is het belangrijk om ervoor te zorgen dat u zo min mogelijk trefwoorden opgeeft. Laten we ons bijvoorbeeld voorstellen dat ik tweets over Facebook en Google wil. Als ik beide als trefwoorden opgeef, bijvoorbeeld FACEBOOK en GOOGLE, zal het me maximaal 100 tweets opleveren, aangezien dat een beperking is. Maar als ik de zoekopdracht twee keer uitvoer – eenmaal met Facebook en eenmaal met Google, kan ik in totaal 200 tweets krijgen. Kortom, het is beter om één trefwoord per zoekopdracht te gebruiken.

‘lang’ vertegenwoordigt de taal van de gefilterde tweets. Omdat ik tweets in het Engels wil ontvangen, stel ik dit in op ‘en’.

‘since’ is de startdatum van de periode waarin u naar tweets wilt zoeken. Deze startdatum moet binnen de afgelopen 7 dagen vallen. Dit is nog een functie die niet is gedocumenteerd in de Twitter API-documentatie.

‘until’ vertegenwoordigt de einddatum van uw gewenste periode. Logisch gezien zou deze ook binnen de afgelopen 7 dagen moeten vallen. Het is ook niet gedocumenteerd in de Twitter API-documentatie.

‘result_type’ vertegenwoordigt het type tweets dat u wilt. Het heeft 3 waarden:

‘recent’ geeft de meest recente tweets, d.w.z. de tweets aan het einde van de geselecteerde periode.

‘popular’ geeft de meest populaire tweets en mist daardoor veel tweets. U krijgt altijd de tweets met de meeste favorieten en retweets. De min_faves -functie zou hier geen nut hebben.

‘mixed’ geeft een mix van recente en populaire tweets.

‘count’ vertegenwoordigt het maximale aantal tweets in het resultaat. De standaardwaarde is ingesteld op 15 en het maximum is 100.

Met het gemengde result_type en het gebruik van min_faves, kunnen we het maximale aantal tweets ophalen door de zoekopdracht meerdere keren uit te voeren.

Voor meer gedocumenteerde functies kunt u ook de Twitter’s API-documentatie.

De opgehaalde tweetgegevens opslaan/automatisch opslaan

Als volgende stap moet u een methode voor automatisch opslaan/opslaan definiëren die een parameter ‘saveOverride’ heeft. Deze stap is simpelweg nodig om de tijdsbeperking voor automatisch opslaan te verwijderen en het bestand op te slaan. Om dit te doen, maak ik een t_last om de starttijd van het programma op te slaan. Vervolgens open ik deze in het programma en controleer ik of er al 5 minuten zijn verstreken sinds de t_last (laatste opslagtijd). Als er meer dan 5 minuten zijn verstreken, markeer ik de ‘saveStatus’ als True.

Vervolgens controleer ik op ‘saveOverride’, wat simpelweg betekent dat ik mijn programma de instructie moet geven dat het bestand nu in ieder geval moet worden opgeslagen. Hiervoor stel ik de saveStatus in op True.

Als ‘saveStatus’ True is, zal het script de t_last wijzigen naar de huidige tijd. Daarna maakt de code een dictionary-object aan en drukt “Autosave om [tijd]” af, zodat u weet dat de gegevens automatisch worden opgeslagen.

Vervolgens controleer ik of het uitvoerbestand al bestaat. Als dat zo is, voeg ik de gegevens en de gegevens uit een reeds opgeslagen bestand samen. Na het samenvoegen schrijf ik het naar hetzelfde bestand. Als het niet bestaat, maak ik een nieuw bestand aan en schrijf ik de gegevens naar dat bestand.

Als resultaat heb ik bijna de volledige functionaliteit gecodeerd die ik wilde.

Verder optimaliseren

Eindelijk is het tijd om deze functies te gebruiken. Ik schrijf een while(1)-loop, wat while(True) betekent. Dit zorgt er in feite voor dat de instructie voor altijd blijft draaien totdat er een ‘break’-statement wordt aangeroepen of er een uitzondering wordt opgeworpen.

Eerst verzamel ik de tweetgegevens in dictionary ‘d’ met behulp van json.loads die de gegevens converteert naar een dictionary-indeling. Vervolgens voer ik een try-catch/except uit op het codeblok dat statussen uit de gegevens extraheert. Ik gebruik try-catch omdat de Twitter-API soms geen gegevens retourneert, maar een JSON waarin de fout wordt vermeld. Ik wil niet dat mijn programma in dergelijke gevallen stopt. Ook wil ik dat het achterhaalt bij welk verzoeknummer dat gebeurt en dat mijn Twitter-gegevens worden opgeslagen met de autosave-opdracht. Twitter staat ons toe om 180 verzoeken per 15 minuten te doen. Dat is ongeveer 12 verzoeken per minuut of één verzoek per vijf seconden. Om het zekere voor het onzekere te nemen, voeg ik een sleep-opdracht toe om mijn programma 5 seconden te laten slapen na het uitvoeren van één iteratie.

Daarna zal de code het aantal tweets weergeven dat het script tot nu toe heeft verzameld.

Eindelijk is het tijd voor de belangrijkste optimalisatietruc. Ik heb dit script bijna een week getest en ik kreeg het volgende aantal tweets voor elke min_faves-waarde. Ik kan maximaal 100 tweets per verzoek ontvangen en ik wil er zoveel mogelijk ophalen. Momenteel zijn er niet veel tweets met hogere waarden van min_faves maar we willen rekening houden met de momenten waarop het bedrijf of het trefwoord wellicht trending is. De maximale waarde van min_faves kan 999999 zijn.

min_faves-waarde Aantal tweets
100,000 1
90,000 1
80,000 1
70,000 2
60,000 3
50,000 6
40,000 6
30,000 12
25,000 12

Daarom gebruik ik een logica die tweets ophaalt vanaf een min_faves-waarde van 60000 en deze vervolgens telkens met 10000 verlaagt totdat deze 10000 bereikt. Maar als het trefwoord bijvoorbeeld trending is en ik 100 tweets ontvang wanneer ik werk met de waarde van min_faves op 30000, dan zal dit de min_faves naar 35000 en haal dan de resultaten opnieuw op. Dus nu is de nieuwe logica 5000 in plaats van 10000. Als de verandering echter afneemt tot minder dan 1000, vraag ik om dit te negeren en door te gaan met het aftrekken van 1000.

Ik specificeer een vast interval van 1000 dat min_faves moet afnemen met als min_faves kleiner is dan of gelijk is aan 10000.

Aan het einde van het programma laat het programma je weten dat het werk klaar is door ‘Einde’ weer te geven.

Je kunt de volledige code vinden op GitHub.

Dat is alles. In de volgende Twitter-datahandleiding ga ik je leren hoe je realtime tweets kunt ophalen met de big-datatool ‘Flume’. Blijf op de hoogte!

author

Akshay Nagpal

Auteur · CloudSigma

Preslav Dobrev is een creatief ontwerper bij CloudSigma, met de nadruk op een consistente bedrijfsidentiteit door middel van traditionele en innovatieve marketingkanalen. Hij is bedreven in het samenvoegen van artistieke visie met strategische marketing om impactvolle merkverhalen te creëren.

Reacties

Nog geen reacties. Wees de eerste.