https://www.ifkw.uni-muenchen.de/funktionen/suche/index.html?q=bachelorarbeit
in Protokoll, Host, Pfad und Parameter.Es gibt jede Menge Anleitungen für unterschiedlichste Scraping-Übungen online. Wir wollen uns hier, zur Veranschaulichung, auf ein sehr einfaches beschränken: Das maschinelle “Abkratzen” von Tabellen, am Beispiel von wahlrecht.de. Das ist ein überparteilicher Dienst (rechtlich gesehen: ein Verein), der die sogenannten Sonntagsfragen für die deutsche Politik sammelt. Dabei werden Teilnehmende danach befragt, wen sie wählen würden, wäre am kommenden Sonntag Wahl. Ursprünglich fokussiert auf die Bundestagswahl, sammelt wahlrecht.de längst auch Sonntagsfragen zu Landtagswahlen und von unterschiedlichen Meinungsforschungsinstituten.
Wir konzentrieren uns hier beispielhaft auf die Sonntagsfragen der Forschungsgruppe Wahlen, die ihre Befragungen im Auftrag des ZDF-Politbarometers alle zwei Wochen (im unmittelbaren Vorfeld von Wahlen auch häufiger) durchführt. Unser Ziel ist es, eine kleine Forschungssoftware (in Python oder R) zu entwickeln, die die berichteten Projektionsergebnisse seit der letzten Bundestagswahl per Scraping erhebt. Dafür müssen wir die Spalten benennen und die Spalte des Veröffentlichungsdatums in ein Datumsformat konvertieren – denn HTML kennt nur Text. Abschließend können wir die erhobenen/abgekratzten Daten danach filtern, dass sie nach der letzten Bundestagswahl erschienen sind.
Zunächst prüfen wir dafür die Angaben der Seite zu Web Scraping selbst über die sogenannte robots.txt
-Datei. Wenn dem Scraping nichts im Weg steht, können wir die Seite über einen GET-Request aufrufen und die entsprechende Tabelle auslesen.
# Python
import urllib.robotparser
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
url = 'https://www.wahlrecht.de/umfragen/politbarometer.htm'
rp = urllib.robotparser.RobotFileParser(url)
rp.read()
rp.can_fetch('*', url)
request = requests.get(url)
politbarometer = pd.DataFrame()
dom = BeautifulSoup(request.text, 'html.parser')
for row in dom.select('table.wilko tbody tr'):
veroeffentlichung = datetime.strptime(row.select('td')[0].text, '%d.%m.%Y')
if veroeffentlichung > datetime.strptime('26.9.2021', '%d.%m.%Y'):
politbarometer = politbarometer.append({ 'Veröffentlichungsdatum': veroeffentlichung,
'CDU/CSU': row.select('td')[2].text,
'SPD': row.select('td')[3].text,
'Grüne': row.select('td')[4].text,
'FDP': row.select('td')[5].text,
'Linke': row.select('td')[6].text,
'AfD': row.select('td')[7].text,
'sonstige': row.select('td')[8].text,
'N': row.select('td')[10].text,
'Befragungszeitraum': row.select('td')[11].text },
ignore_index = True)
# R
library(tidyverse)
library(rvest)
library(polite)
url <- 'https://www.wahlrecht.de/umfragen/politbarometer.htm'
session <- bow(url)
request <- scrape(session)
politbarometer <-
request %>%
html_element('table.wilko tbody') %>%
html_table(header = F,
trim = T,
dec = ',',
na.strings = c('', '?', '–', '-'),
convert = T) %>%
select('Veröffentlichungsdatum' = X1,
'CDU/CSU' = X3,
'SPD' = X4,
'Grüne' = X5,
'FDP' = X6,
'Linke' = X7,
'AfD' = X8,
'sonstige' = X9,
'N' = X11,
'Befragungszeitraum' = X12) %>%
mutate(Veröffentlichungsdatum = dmy(Veröffentlichungsdatum)) %>%
filter(Veröffentlichungsdatum > dmy('26.09.2021'))
Für agentenbasierte Tests hat sich zuletzt immer stärker die frei verfügbare Selenium-WebDriver-Bibliothek etabliert. Sie benötigt vier Teile:
pip install selenium
). R benötigt einen Umweg über Java – die Installation umfasst also Java, die entsprechende Java-Bibliothek und das R-Paket.# Python
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://github.com/datenfruehstueck/ccs')
readme_link = driver.find_element_by_css_selector('[title="LICENSE.txt"]')
readme_link.click()
selenium.current_url
driver.title
# R
library(RSelenium)
rsDriver()
selenium <- remoteDriver()
selenium$open()
selenium$navigate('https://github.com/datenfruehstueck/ccs')
readme_link <- selenium$findElement(using = 'css', '[title="LICENSE.txt"]')
readme_link$clickElement()
selenium$getCurrentUrl()
selenium$getTitle()
Auch für die Nutzung von Selenium gibt es online zahlreiche Einsteigstutorials. Die größte Hürde ist hierbei wohl, das Ganze ans Laufen zu bekommen. Geschafft? Super! Dann sind die folgenden Aufgaben mithilfe der Online-Hilfe von Selenium sicher kein Problem:
q
und geben Sie automatisiert einen Suchbegriff ein. Anschließend übermitteln Sie mithilfe von Selenium ein Enter.a
-Elemente und insbesondere, je a
-Element, den Inhalt des href
-Attributs extrahieren.Web Tracking erfolgt meist über professionelle Werkzeuge, die den Rahmen dieser Übung hier sprengen würden. Die Analyse der so erhaltenen Daten fällt in andere Sitzungen.
Alle großen Plattformen sind (in der EU) verpflichtet, ihren Nutzenden die Möglichkeit zum Download der über die Person gespeicherten Daten anzubieten. Das darf nicht zu versteckt sein. Google etwa bietet ein eigenes Portal dafür an, um die Daten aus unterschiedlichen Services zu bündeln. Facebook bietet den Download in den Profileinstellungen je Service (z.B. für Facebook oder Instagram separat). Auch bei TikTok ist der Export in den Privatsphäre-Einstellungen zu finden. Bei Amazon ist der Export der eigenen Daten auf den Amazon-Hilfeseiten in den Profil- und Privatsphäre-Informationen verortet.
In Forschungsprojekten mit Datenspenden würden Sie in weiterer Folge Teilnehmende bitten, Teile ihrer Daten mit Ihnen zu teilen (= sie Ihnen zu “spenden”).
Ab hier folgen nun verschiedene Lösungswege zu den oben vorgestellten Übungen. Damit Sie die nicht “versehentlich” überscrollen und so Ihrer Übungsmöglichkeiten beraubt werden, folgt hier zunächst ein visueller Bruch.
https
, Host: www.ifkw.uni-muenchen.de
, Pfad: funktionen/suche/index.html
, ein Parameter namens q
mit dem Wert bachelorarbeit