Leeromgeving   |   Onderzoek   |   Werken bij   |   OSINT vacatures   |   Contact   |   
Flickr and Python

Hoe kunt u uw Flickr-zoekslagen verder automatiseren?

In deel 1 van deze blogpost hebben wij u laten zien hoe u gebruikers op Flickr kunt vinden aan de hand van een e-mailadres. Wij hebben u laten zien dat u hiervoor de publieke API-sleutel van Flickr kunt gebruiken. In deel 2 van deze blogpost hebben wij beschreven hoe u zelf een Python-script kunt maken om uw zoekslagen te automatiseren. In deze blogpost leggen wij u uit hoe u uw resultaten kunt opschonen, hoe u uw script meer gebruikersvriendelijk kan maken en hoe u uw resultaten kunt opslaan in een CSV-bestand.

Allereerst: gebruik een nieuwe API-sleutel

Om de publieke API van Flickr te kunnen gebruiken heeft u, zoals u inmiddels weet, de publieke API key van Flickr nodig. Zoek deze publieke API key bijvoorbeeld op via de Flickr Api Explorer: typ handmatig een e-mailadres als “johndoe@ gmail.com” in en bekijk de URL onderin het scherm. In ons geval leidt dit tot de onderstaande werkende URL. De API key uit deze URL kunt u vervolgens gebruiken in uw eigen Pythonscript. Bent u vergeten hoe dit moet? Lees dan deel 2 van deze blogpost even terug.

https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=3eeb03cea945a8f597c529ebd454051b&find_email=johndoe%40gmail.com&format=rest

Uw Python script opschonen

Als u alle stappen uit onze tweede blog heeft gevolgd en u zojuist een nieuwe publieke API key in uw Python-script heeft verwerkt, dan kunt u aan de hand van uw script controleren of er een gebruiker is gekoppeld aan een door u opgegeven e-mailadres. Voordat u verder gaat is het handig om dit even te testen. Werkt alles? Lees dan verder.

Stap 1: bekijk het resultaat van uw script

Als u het resultaat van uw script bekijkt, dan kunnen we het resultaat gebruiken om na te denken over hoe we uw script kunnen verbeteren om niet-relevante informatie weg te filteren. In onderstaande resultaten ziet u bijvoorbeeld een “response code” met de waarde “200″ staan. Ondanks dat dit resultaat aangeeft dat uw request richting de webserver is geslaagd, heeft deze informatie verder geen waarde als we enkel willen weten of er een gebruiker aan een e-mailadres gekoppeld is. We gaan ons script dus zodanig opschonen dat u enkel de “user id” en de “username” terug krijgt.

Python resultaat

Stap 2: installeer de Python-bibliotheek BeautifulSoup

Voordat we uw script opschonen installeren we de Python library “BeautifulSoup“. Met de Python-bibliotheek BeautifulSoup kunt u data uit een HTML- of een XML-bestand ophalen en op een dusdanige wijze presenteren dat Python-objecten gemakkelijk te doorlopen zijn. Installeer de bibliotheek als volgt via uw Windows Command Prompt (CMD):

pip install beautifulsoup4

Stap 3: imporeer de Python-bibliotheek BeautifulSoup

Importeer de BeautifulSoup-bibliotheek door het volgende in uw Python-script op te nemen:

from bs4 import BeautifulSoup

U ziet in het bovenstaande commando de tekst “from bs4 import” staan. Dit gedeelte geeft aan dat u enkel het object “BeautifulSoup” uit de “BeautifulSoup-bibliotheek” importeert.

Stap 4: installeer de lxml-parser

BeautifulSoup kunt u gebruiken met “parsers” als de “html.parser” en de “lxml-parser“. Parsers “parseren” rommelige of verkeerd geformatteerde HTML-code waardoor uw resultaten er meer gestructureerd uit komen te zien. Klinkt dit een beetje vaag? Dan zal verderop wel duidelijk worden wat we precies bedoelen. Installeer lxml als volgt via de Windows Opdracht Prompt (CMD)

pip install lxml

Stap 5: importeer de lxml-parser

Importeer de lxml-parser als volgt in uw Python-script.

import lxml

Stap 6: maak een Soup-object aan

Om BeautifulSoup uit te voeren, gebruikt u het onderstaande commando.

#soup maken
soup = BeautifulSoup(response.text, 'lxml')

In het bovenstaande vormt het eerste gedeelte “response.text” de HTML-tekst waarop het object “soup” is gebaseerd. De “response.text” was immers het resultaat van de opgevraagde HTML-pagina zoals we deze eerder hebben gespecificeerd. Het tweede gedeelte “lxml” geeft de parser aan die BeautifulSoup moet gebruiken om het object “soup” aan te maken.

Stap 7: print het Soup-object

Om te testen of alles werkt kunt u nu uw script uitvoeren. Ons script ziet er op dit moment als volgt uit.

Python print soup

En geeft het volgende resultaat:

Python print soup resultaat

Dit script werkt dus. En als u goed kijkt ziet u nu dat het resultaat er iets anders uitziet dan het eerdere resultaat. U ziet nu bijvoorbeeld ook de gedeeltes “<html><body>” en “</body></html>” staan. Dit is heel logisch, want u heeft immers de HTML-inhoud van een webpagina opgevraagd.

Stap 8: gebruik “prettyprint” voor mooiere resultaten

Om uw resultaten mooier (in een “geneste structuur“) te weergeven, kunt u het onderstaande commando gebruiken.De

print(soup.prettify())

U krijgt hiermee het volgende resultaat waarin de HTML-structuur genest wordt weergegeven. Dat wil bijvoorbeeld zeggen dat “<rsp stat=”ok”>”  tot aan “</rsp>” onder de “<body>” van de HTML-pagina vallen.

Python print soup resultaat pretty

Stap 9: de print-resultaten filteren

Met bovenstaande bent u er nog niet, u wilt immers enkel de user-id en de username van de betreffende gebruiker uitprinten. Hiervoor moet u in de HTML kijken naar waar de informatie die u zoekt precies staat opgeslagen. Als we beginnen met de gebruikersnaam, dan wordt de gebruikersnaam bijvoorbeeld direct getoond tussen “<username>” en “</username>“. U kunt vervolgens precies dit stukje in uw script aanwijzen via het onderstaande commando.

#filteren van resultaten
user_name = soup.username.text 

Met het bovenstaande commando zoekt u naar het text-gedeelte dat zich bevindt in de volgende structuur: html > body > username. Door “soup.username.text” te gebruiken roept u direct de waarde van het object “username” aan, welke in dit geval de gebruikersnaam betreft. Wilt u de variabele “user_name” uitprinten, dan doet u dat als volgt:

print(user_name)

Het resultaat dat u te zien krijgt is dan enkel de username:

Python print soup resultaat pretty user_name

Stap 9: zelf tekst bijvoegen

Uw script doet nu precies hetgeen wat het zou moeten doen: het toont de gebruikersnaam van een gebruiker op basis van een e-mailadres dat u heeft opgegeven. U kunt met het onderstaande commando duidelijker maken wat het resultaat is dat u te zien krijgt. U kunt dus zelf begeleidende tekst opgeven.

print('\nGebruikersnaam:',user_name)

Het resultaat is dan als volgt:

Python print soup resultaat pretty user_name met tekst

Stap 10: meer filters gebruiken en deze uitprinten

Met bovenstaande heeft u enkel de gebruikersnaam uitgeprint, maar u wilt ook nog het user-id weten. U kunt daarvoor onderstaande code gebruiken.

#filteren van resultaten
user_name = soup.username.text
user_id = soup.user
user_profiel = ('https://www.flickr.com/people/'+user_id.get('id'))

#alles printen
print('\nGebruikersnaam:', user_name)
print('Gebruikers ID:', user_id.get('id'))
print('Flickr-profiel:', user_profiel)

Indien u vervolgens alles uitprint, krijgt u het onderstaande resultaat.

Python print soup resultaat alles

Uw script gebruiksvriendelijk maken

Bovenstaande script werkt, maar is nog niet heel gebruiksvriendelijk. U moet namelijk steeds de code van uw script aanpassen om deze te laten werken, en dat moet u ook nog eens voor elk e-mailadres doen dat u wilt controleren. Het is dus tijd om uw script meer gebruiksvriendelijk te maken.

Stap 1: maak een mooie template

Veel scripts hebben in het begin een mooie template. Een script ziet er daardoor veel spannender uit. U zou dit al heel simpel als volgt kunnen doen.

print()
print('\n*************************************************************************************'
'\nDoel: \t\tZoeken naar Flickr-gebruiker via e-mailadres'
'\nCopyright: \tAware Online')
print('*************************************************************************************')

Als u het script nu print, krijgt u namelijk het volgende resultaat. Is dat niet tof?

Python startscherm

Stap 2: maak nieuwe input-variabelen aan

Het script dat u gemaakt heeft is op dit moment nog vrij statisch. In het script zit namelijk de API key van Flickr verwerkt en ook het e-mailadres dat u wilt onderzoeken. Indien u het script vaker wilt gebruiken, kunt u wellicht de API key en het e-mailadres als input-waarde gebruiken om in een variabele op te slaan.

Voor het e-mailadres kunt u dat als volgt doen, de API key laten we voor nu gewoon staan:

print('Vul het e-mailadres gegevens van uw target in:\n')
emailadres = input("E-mailadres: ")

Let erop dat u in het bovenstaande geval ook de URL in uw code aanpast. Het e-mailadres dat u via het input-veld opgeeft wilt u immers gebruiken in de URL die u gaat bezoeken. Dat kan bijvoorbeeld als volgt.

url = 'https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=3eeb03cea945a8f597c529ebd454051b&find_email='+emailadres+'&format=rest'

Als u nu het resultaat print, wordt aan u gevraagd om een e-mailadres van uw target in te vullen. Dit kunt u handmatig doen, waarna het script gewoon wordt uitgevoerd als voorheen.

Python email input

De resultaten opslaan in een CSV-bestand

Met uw script kunt u controleren of er een e-mailadres aan een account op Flickr gekoppeld is. Door uw script te runnen krijgt u uw resultaten in uw terminal te zien. Soms is het handiger om de gevonden resultaten direct op te slaan in een bestand waarmee u verder kunt werken. In een CSV-bestand bijvoorbeeld. Hieronder leest u hoe u uw resultaten opslaat in een CSV-bestand.

Stap 1: installeren xlwt-library

Om spreadsheets te kunnen genereren die gebruikt kunnen worden in Microsoft Excel is een Python-bibliotheek als “xlwt” nodig. Deze Python-bibliotheek kunt u als volgt installeren via de Windows Command Prompt (CMD):

pip install xlwt

Stap 2: importeren workbook uit xlwt

Uit de Python-bibliotheek xlwt hebben we vervolgens het object “workbook” nodig. Dit object importeert u als volgt.

#importeren workbook uit xlwt-library
from xlwt import workbook

Stap 3: workbook aanmaken

Met de Python-bibliotheek kunt u vervolgens als volgt een workbook als variabele “wb” aanmaken.

#aanmaken van een workbook
wb = Workbook()

Stap 4: spreadsheet aanmaken

Nu u een workbook heeft aangemaakt, kunt u een spreadsheet aan te maken. Dat doet u als volgt:

#Aanmaken van een sheet via add_sheet
sheet1 = wb.add_sheet('Sheet 1')

Met deze functie heeft u een spreadsheet aangemaakt en heeft u deze spreadsheet de naam “Sheet 1” gegeven.

Stap 5: spreadsheet vullen

Nu u een spreadsheet heeft aangemaakt, kunt u specificeren wat er op de spreadsheet geschreven moet worden. Dat doet u als volgt:

#Sheet vullen
sheet1.write(0, 0, 'E-mailadres')
sheet1.write(0, 1, 'Username')
sheet1.write(0, 2, 'User ID')
sheet1.write(0, 3, 'Link')

De waardes voor de komma geven aan in welke “cel” op het spreadsheet u zich bevindt. De waarde “0,0” geeft dus aan dat u zich in cel “A1” bevindt. Wilt u cel “B1” selecteren, dan schuift u dus als het ware één plaatsje op naar rechts. In uw code schrijft u dan “0,1,“. De waarde die u vervolgens tussen quotes ‘E-mailadres1‘ weergeeft, geven aan wat er in de cel komt te staan. In dit voorbeeld heeft cel “A1” dus de waarde “E-mailadres“. Met onderstaande code kunt u vervolgens de waardes invullen op basis van wat uw script heeft gegenereerd.

sheet1.write(1, 0, emailadres)
sheet1.write(1, 1, user_name)
sheet1.write(1, 2, user_id.get('id'))
sheet1.write(1, 3, user_profiel)

Stap 6: document opslaan

Voordat u uw script runt, moet u bovenstaande uitwerkingen nog opslaan in een bestand. Dat doet u als volgt, met in dit geval als naam “flickr_resultaat.xls“:

#bestand opslaan
wb.save('flickr_resultaat.xls')

Het eindresultaat ziet er dan als volgt uit.

Python csv

Wat nu verder?

Met bovenstaande stappen heeft u een basaal Python-script gemaakt waarmee u kunt controleren of er een gebruiker op Flickr aan één specifiek e-mailadres is gekoppeld. U heeft uw resultaten opgeschoond, u heeft uw script gebruiksvriendelijker gemaakt en u heeft uw resultaten opgeslagen in een CSV-bestand. In een volgende blogpost leggen wij u uit hoe u de informatie van een specifiek profiel kunt scrapen, en hoe u meerdere e-mailadressen kunt importeren en verwerken. Heeft u tips of suggesties? Laat het ons weten!