Twitter, eine der wichtigsten Social-Media-Plattformen, verfügt über einige der interessantesten Internetinhalte und eine Vielzahl nützlicher Daten für Unternehmen, die ihre Märkte verstehen und erweitern möchten.
Sie können zwar programmgesteuert über die Twitter-API auf diese Daten zugreifen, aber die Raten sind begrenzt und das Verfahren ist zeitaufwändig. Außerdem hat Twitter vor Kurzem das Ende des kostenlosen API-Zugangs angekündigt und seine API-Kosten drastisch erhöht, wodurch die API-Methode für viele kleine und mittelständische Unternehmen unerschwinglich werden könnte. Mit Web Scraping können Sie diese Probleme jedoch vermeiden und das, was Sie brauchen, ganz einfach extrahieren.
Unter Web Scraping versteht man das Erfassen und Speichern großer Datenmengen von Websites und Webanwendungen mithilfe von automatisierten Skripten oder Bots. In diesem Artikel erfahren Sie, wie Sie Twitter-Daten mit Python und Selenium scrapen können. Für das Web Scraping ist diese Kombination sehr beliebt.
Scrapen von Twitter mit Selenium
Diese Anleitung hilft Ihnen zunächst zu verstehen, was Sie scrapen sollten, und erklärt Ihnen dann Schritt für Schritt, wie Sie dabei vorgehen sollten.
Voraussetzungen
Bevor Sie anfangen, müssen Sie eine lokale Kopie von Python auf Ihrem System installieren. Die neueste stabile Distribution wird funktionieren (zum Zeitpunkt der Erstellung dieses Artikels ist das 3.11.2).
Sobald Sie Python installiert haben, installieren Sie die nachstehenden Abhängigkeiten über pip, dem offiziellen Paketmanager von Python:
- Selenium
- Webdriver Manager
Um die Abhängigkeiten zu installieren, führen Sie die folgenden Befehle aus:
pip install selenium
pip install webdriver_manager
Was möchten Sie scrapen?
Die Entscheidung, was gescrapt werden soll, ist ebenso wichtig wie die korrekte Ausführung des Scraping-Skripts. Das liegt daran, dass Selenium Ihnen Zugang zu einer kompletten Website der Twitter-Anwendung verschafft, die eine so große Datenmenge enthält, dass sie Ihnen wahrscheinlich nicht nutzen wird. Das bedeutet, dass Sie eindeutig verstehen und definieren müssen, wonach Sie suchen, bevor Sie mit dem Schreiben eines Python-Skripts beginnen.
Im Rahmen dieser Anleitung werden Sie die folgenden Daten aus einem Benutzerprofil extrahieren:
- Name
- Benutzername
- Standort
- Website
- Beitrittsdatum
- Anzahl der Follower
- Followers count
- Tweets
Scrapen eines Benutzerprofils
Um mit dem Scrapen einer Benutzerprofilseite zu beginnen, erstellen Sie eine neue Python-Skriptdatei mit der Bezeichnung profil-seite.py
. Um sie auf *nix-Systemen zu erstellen, verwenden Sie den folgenden Befehl:
touch profile-page.py
Bei Systemen, die keine*nix-Systeme sind, können Sie die Datei einfach mit Ihrem Dateimanager (z. B. Windows Explorer) erstellen.
Einrichten von Selenium
Nachdem Sie eine neue Python-Skriptdatei erstellt haben, importieren Sie die folgenden Module in Ihr Skript:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
Richten Sie dann einen neuen Selenium WebDriver ein (das ist im Grunde nichts anderes als ein automatisierter Webbrowser, der von Ihrem Skript gesteuert wird):
driver= webdriver.Chrome(service=Service(ChromeDriverManager().install()))
Bevor Sie die Website laden und Daten scrapen, legen Sie die URL der Website fest. Da die URL der Twitter-Profilseiten von den jeweiligen Benutzernamen abhängig sind, müssen Sie den folgenden Code in Ihr Skript einfügen, um eine URL für die Profilseite eines bestimmten Benutzernamens zu erstellen:
username = "bright_data"
URL = "https://twitter.com/" + username + "?lang=en"
Laden Sie dann die Website:
driver.get(URL)
Warten Sie, bis die Website geladen ist
Sie können erst dann mit dem Scraping der Daten dieser Website fortfahren, wenn diese vollständig geladen ist. Es gibt zwar einige Methoden, die es Ihnen ermöglichen festzustellen, ob eine HTML-Seite vollständig geladen ist (z. B. die Überprüfung von document.readyState
), aber bei einer Single-Page-Anwendung (SPA) wie Twitter erweist sich das nicht als nützlich. In diesem Fall müssen Sie warten, bis die client-seitigen API-Aufrufe abgeschlossen sind und die Daten auf der Website gerendert sind, bevor Sie diese abrufen können.
Dazu müssen Sie Ihrem Skript den folgenden Code hinzufügen:
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="tweetss"]')))
except WebDriverException:
print("Tweets did not appear! Proceeding after timeout")
Dieser Code veranlasst den WebDriver bevor er fortfährt, auf ein Element mit dem Attribut data-testid="tweet"
zu warten, bis dieses auf der Website geladen ist. Der Grund für die Wahl dieses speziellen Elements und Attributs ist, dass dieses Attribut nur in Tweets, die einem Profil angehören, vorkommt. Wenn diese Tweets geladen sind, zeigt das Attribut an, dass auch der Rest der Seite geladen wurde:
Bitte beachten Sie Folgendes: Sie müssen vorsichtig sein, wenn Sie entscheiden, wie Sie die Seite als geladen markieren. Der genannte Code-Ausschnitt funktioniert bei einem öffentlich zugänglichen Profil, das mindestens einen Tweet enthält. In allen anderen Fällen schlägt er jedoch fehl, und eine
WebDriverException
wird ausgelöst. In solchen Fällen fährt das Skript fort, nachdem es die angegebene Timeout-Zeit abgewartet hat (die in diesem Fall zehn Sekunden dauert).
Informationen extrahieren
Jetzt sind Sie bereit, mit dem wichtigsten Teil der Anleitung zu beginnen, dem Extrahieren von Informationen. Um jedoch Daten aus der geladenen Website zu extrahieren, müssen Sie die Struktur der Website kennen, die Sie scrapen wollen:
Name
Wenn Sie Chrome DevTools öffnen und den Quellcode für das Element „Name“ auf der Website suchen, sollten Sie in etwa Folgendes sehen:
<span class="css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0">Bright Data</span>
Das Element „Name“ ist von einem span
-Tag verpackt und bekommt eine Reihe von (offensichtlich) zufällig generierten Klassen zugewiesen. Das bedeutet, dass Sie sich nicht auf diese Klassennamen verlassen können, um das Container-Tag für das Element „Name“ des Benutzers auf der Profilseite zu erkennen. Sie müssen nach etwas Statischem suchen.
Wenn Sie in der Hierarchie des HTML-Quelltextes für das Element „Name“ nach oben gehen, finden Sie ein div
-Tag, das sowohl den Namen als auch den Benutzernamen enthält (unterhalb mehrerer span
-Ebenen). Das Start-Tag für den div
-Container sieht folgendermaßen aus:
<div class="css-1dbjc4n r-6gpygo r-14gqq1x" data-testid="UserName">
Außer den zufällig generierten Klassennamen gibt es auch ein weiteres Attribut mit der Bezeichnung data-testid
. data-testid
ist ein HTML-Attribut, das hauptsächlich zum Testen der Benutzeroberfläche verwendet wird, um HTML-Elemente für die Durchführung automatisierter Tests zu erkennen und aufzufinden. Verwenden Sie dieses Attribut, um den div
-Container auszuwählen, der den Namen des Nutzers enthält. Er enthält jedoch auch den Benutzernamen (d. h. den Twitter-Username). Das bedeutet, dass Sie den Text an der Stelle des Zeilenumbruchs aufteilen und dann das erste Element (den Namen des Nutzers) extrahieren müssen:
name = driver.find_element(By.CSS_SELECTOR,'div[data-testid="UserName"]').text.split('\n')[0]
Bio, Standort, Website und Beitrittsdatum
Genauso wie Sie den richtigen Selektor für das Element „Name“ ermittelt haben, finden Sie auch die richtigen Selektoren für die anderen Datenpunkte. Sie werden feststellen, dass den Elementen „Bio“, „Standort“, „Website“ und „Beitrittsdatum“ das Attribut data-testid
s beigefügt ist. Das macht es einfach, CSS-Selektoren zu schreiben, um die Elemente zu finden und die darin enthaltenen Daten zu extrahieren:
bio = driver.find_element(By.CSS_SELECTOR,'div[data-testid="UserDescription"]').text
location = driver.find_element(By.CSS_SELECTOR,'span[data-testid="UserLocation"]').text
website = driver.find_element(By.CSS_SELECTOR,'a[data-testid="UserUrl"]').text
join_date = driver.find_element(By.CSS_SELECTOR,'span[data-testid="UserJoinDate"]').text
Follower und Anzahl der Follower
Wenn Sie sich die Follower und die Anzahl der Follower ansehen, werden Sie feststellen, dass das Attribut data-testid
nicht beigefügt ist. Das bedeutet, dass Sie kreativ werden müssen, um diese richtig zu erkennen und auszuwählen.
In der Hierarchie aufzusteigen hilft nicht, da keins der verwandten Elemente mit statischen Attributen versehen ist. In einem solchen Fall müssen Sie Xpath. verwenden.
XPath steht für XML Path Language und ist eine Sprache, die verwendet wird, um in XML-Dokumenten auf Tags zu verweisen (oder Verweise darauf zu erstellen). Mit Xpath können Sie einen Selektor schreiben, der nach einem span
-Container mit dem Text „Following“
sucht. Gehen Sie dann in dieser Hierarchie eine Ebene aufwärts, um den Zählwert zu finden. (Der Grund dafür ist, dass sowohl der Text „Following“
als auch der Zählwert in einzelne Container-Tags verpackt sind):
following_count = driver.find_element(By.XPATH, "//span[contains(text(), 'Following')]/ancestor::a/span").text
So können Sie auch einen XPath-basierten Selektor für den Follower-Zähler schreiben:
followers_count = driver.find_element(By.XPATH, "//span[contains(text(), 'Followers')]/ancestor::a/span").text
Tweets
Glücklicherweise hat jeder Tweet einen übergeordneten Container (sog. Elterncontainer), der den data-testid
-Wert „tweet“ (den Sie zuvor verwendet haben, um zu prüfen, ob die Tweets geladen wurden) enthält. Sie können die Funktion find_elements()
anstelle der find_element()
-Methode von Selenium verwenden, um alle Elemente zu erfassen, die dem angegebenen Selektor entsprechen:
tweets = driver.find_elements(By.CSS_SELECTOR, '[data-testid="tweet"]')
Alles drucken
Um alles, was Sie extrahiert haben, auf stdout
auszugeben, verwenden Sie den folgenden Code:
print("Name\t\t: " + name)
print("Bio\t\t: " + bio)
print("Location\t: " + location)
print("Website\t\t: " + website)
print("Joined on\t: " + join_date)
print("Following count\t: " + following_count)
print("Followers count\t: " + followers_count)
Zum Drucken des Inhalt der Tweets müssen Sie eine Schleife aller Tweets durchlaufen und den Text aus dem Textcontainer des Tweets extrahieren (ein Tweet enthält neben dem Hauptinhalt auch andere Elemente wie Avatar, Benutzername, Uhrzeit und Aktionsschaltflächen). Hier erfahren Sie, wie Sie dafür einen CSS-Selektor verwenden können:
for tweet in tweets:
tweet_text = tweet.find_element(By.CSS_SELECTOR,'div[data-testid="tweetText"]').text
print("Tweet text\t: " + tweet_text)
Führen Sie das Skript mit dem folgenden Befehl aus:
python profile-page.py
Sie sollten dann eine Ausgabe wie diese erhalten:
Name : Bright Data
Bio : The World's #1 Web Data Platform
Location : We're everywhere!
Website : brdta.com/2VQYSWC
Joined on : Joined February 2016
Following count : 980
Followers count : 3,769
Tweet text : Happy BOO-RIM! Our offices transformed into a spooky "Bright Fright" wonderland today. The treats were to die for and the atmosphere was frightfully fun...
Check out these bone-chilling sights:
Tweet text : Our Bright Champions are honored each month, and today we are happy to present February's! Thank you for your exceptional work.
Sagi Tsaeiri (Junior BI Developer)
Or Dinoor (Compliance Manager)
Sergey Popov (R&D DevOps)
Tweet text : Omri Orgad, Chief Customer Officer at
@bright_data
, explores the benefits of outsourcing public web data collections for businesses using AI tools.
#WebData #ArtificialIntelligence
Click the link below to find out more
.
.
.
<output truncated>
Hier finden Sie den vollständigen Code für das Scraping-Skript:
# import the required packages and libraries
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
# set up a new Selenium driver
driver= webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# define the username of the profile to scrape and generate its URL
username = "bright_data"
URL = "https://twitter.com/" + username + "?lang=en"
# load the URL in the Selenium driver
driver.get(URL)
# wait for the webpage to be loaded
# PS: this considers a profile page to be loaded when at least one tweet has been loaded
# it might not work well for restricted profiles or public profiles with zero tweets
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="tweet"]')))
except WebDriverException:
print("Tweets did not appear! Proceeding after timeout")
# extract the information using either CSS selectors (and data-testid) or XPath
name = driver.find_element(By.CSS_SELECTOR,'div[data-testid="UserName"]').text.split('\n')[0]
bio = driver.find_element(By.CSS_SELECTOR,'div[data-testid="UserDescription"]').text
location = driver.find_element(By.CSS_SELECTOR,'span[data-testid="UserLocation"]').text
website = driver.find_element(By.CSS_SELECTOR,'a[data-testid="UserUrl"]').text
join_date = driver.find_element(By.CSS_SELECTOR,'span[data-testid="UserJoinDate"]').text
following_count = driver.find_element(By.XPATH, "//span[contains(text(), 'Following')]/ancestor::a/span").text
followers_count = driver.find_element(By.XPATH, "//span[contains(text(), 'Followers')]/ancestor::a/span").text
tweets = driver.find_elements(By.CSS_SELECTOR, '[data-testid="tweet"]')
# print the collected information
print("Name\t\t: " + name)
print("Bio\t\t: " + bio)
print("Location\t: " + location)
print("Website\t\t: " + website)
print("Joined on\t: " + join_date)
print("Following count\t: " + following_count)
print("Followers count\t: " + followers_count)
# print each collected tweet's text
for tweet in tweets:
tweet_text = tweet.find_element(By.CSS_SELECTOR,'div[data-testid="tweetText"]').text
print("Tweet text\t: " + tweet_text)
Scrapen Sie Twitter mit Bright Data
Web Scraping bietet Ihnen zwar viel Flexibilität und Kontrolle über die Art und Weise, wie Sie Daten aus Webseiten extrahieren, kann aber manchmal schwierig einzurichten sein. Wenn die Ziel-Webanwendung die meisten ihrer Webdaten über XHR-Aufrufe lädt, nachdem sie die statische Website geladen hat, und es nur sehr wenige statische Identifikatoren in HTML gibt, mit denen die gesuchten Elemente gefunden werden können (ähnlich wie wir zuvor bei Twitter gesehen haben), kann es schwierig sein, die richtige Konfiguration ausfindig zu machen.
In diesen Fällen ist Bright Data eine große Hilfe. Bright Data ist eine Webdatenplattform, mit der Sie große Mengen unstrukturierter Daten aus dem Internet extrahieren können. Bright Data bietet ein Produkt zum Scrapen von Twitter-Daten, das Ihnen hilft, eine detaillierte Sammlung fast aller möglichen Datenpunkte, die auf den Twitter-Websites zur Verfügung stehen, zu erhalten.
Im Folgenden finden Sie eine Anleitung, wie Sie beispielsweise dasselbe Twitter-Benutzerprofil mit Bright Data scrapen können.
Beginnen Sie, indem Sie zum Bedienfeld von Bright Data navigieren. Klicken Sie auf die Schaltfläche Datenerfassung anzeigen, um die von Bright Data angebotenen Lösungen zum Web Scraping anzuzeigen:
Klicken Sie anschließend unter Web Scraper IDE auf Gratis testen:
Bright Data stellt Ihnen Web Scraper IDE zur Verfügung, mit dem Sie Ihren eigenen Scraper von Grund auf oder auf Basis einer Vorlage erstellen können. Bright Data bietet Ihnen außerdem eine automatisch skalierende Infrastruktur und integrierte Debug-Tools, die Ihnen einen schnellen Einstieg ermöglichen.
Sie werden aufgefordert, entweder einen Scraper von Grund auf neu zu erstellen oder eine vorhandene Vorlage zu verwenden. Wenn Sie schnell einsteigen möchten, schauen Sie sich die Twitter-Hashtag-Suchvorlage an (die Sie an dieser Stelle für die anfängliche Einrichtung der IDE verwenden werden). Klicken Sie auf die Option Twitter-Hashtag-Suche:
Sie sollten die komplette IDE zusammen mit einigen Codes, die dem Editor bereits hinzugefügt wurden, auf dem Bildschirm sehen können, damit Sie starten können. Um diese IDE zum Scrapen von Twitter-Profilseiten zu verwenden, entfernen Sie den im Editor vorhandenen Code und fügen Sie den folgenden Code ein:
const start_time = new Date().getTime();
block(['*.png*', '*.jpg*', '*.mp4*', '*.mp3*', '*.svg*', '*.webp*', '*.woff*']);
// Set US ip address
country('us');
// Save the response data from a browser request
tag_response('profile', /\/UserTweets/)
// Store the website's URL here
let url = new URL('https://twitter.com/' + input["Username"]);
// function initialization
async function navigate_with_wait() {
navigate(url, { wait_until: 'domcontentloaded' });
try {
wait_network_idle({ ignore: [/accounts.google.com/, /twitter.com\/sw.js/, /twitter.com\/i\/jot/] })
} catch (e) { }
}
// calling navigate_with_wait function
navigate_with_wait()
// sometimes page does not load. If the "Try again" button exists in such case, try to click it and wait for results
let try_count = 0
while (el_exists('[value="Try again"]') && try_count++ <= 5) {
// wait_page_idle(4000)
if (el_exists('[value="Try again"]')) {
try { click('[value="Try again"]', { timeout: 1e3 }) } catch (e) { }
} else {
if (location.href.includes(url)) break
else navigate_2()
}
if (el_exists('[data-testid="empty_state_header_text"]')) navigate_2()
}
const gatherProfileInformation = (profile) => {
// Extract tweet-related information
let tweets = profile.data.user.result.timeline_v2.timeline.instructions[1].entries.flatMap(entry => {
if (!entry.content.itemContent)
return [];
let tweet = entry.content.itemContent.tweet_results.result
return {
"text": tweet.legacy.full_text,
"time": tweet.legacy.created_at,
"id": tweet.legacy.id_str,
"replies": tweet.legacy.reply_count,
"retweets": tweet.legacy.retweet_count,
"likes": tweet.legacy.favorite_count,
"hashtags": tweet.legacy.entities?.hashtags.toString(),
"tagged_users": tweet.legacy.entities?.user_mentions.toString(),
"isRetweeted": tweet.legacy.retweeted,
"views": tweet.views.count
}
})
// Extract profile information from first tweet
let profileDetails = profile.data.user.result.timeline_v2.timeline.instructions[1].entries[0].content.itemContent.tweet_results.result.core.user_results.result;
// Prepare the final object to be collected
let profileData = {
"profile_name": profileDetails.legacy.name,
"isVerified": profileDetails.legacy.verified, // Might need to swap with profileDetails.isBlueVerified
"bio": profileDetails.legacy.description,
"location": profileDetails.legacy.location,
"following": profileDetails.legacy.friends_count,
"followers": profileDetails.legacy.followers_count,
"website_url": profileDetails.legacy.entities?.url.urls[0].display_url || "",
"posts": profileDetails.legacy.statuses_count,
"media_count": profileDetails.legacy.media_count,
"profile_background_image_url": profileDetails.legacy.profile_image_url_https,
"handle": profileDetails.legacy.screen_name,
"collected_number_of_posts": tweets.length,
"posts_info": tweets
}
// Collect the data in the IDE
collect(profileData)
return null;
}
try {
if (el_is_visible('[data-testid="app-bar-close"]')) {
click('[data-testid="app-bar-close"]');
wait_hidden('[data-testid="app-bar-close"]');
}
// Scroll to the bottom of the page for all tweets to load
scroll_to('bottom');
// Parse the webpage data
const { profile } = parse();
// Collect profile information from the page
gatherProfileInformation(profile)
} catch (e) {
console.error(`Interaction warning (1 stage): ${e.message}`);
}
Der vorherige Code ist mit internen Kommentaren versehen, damit Sie besser verstehen, was passiert. Die Grundstruktur ist wie folgt:
- Navigieren Sie zur Profilseite
- Warten Sie, bis die Seite geladen ist
- Fangen Sie die Antwort von der API
/UserTweets/
ab. - Parsen Sie die Antwort und extrahieren Sie die Informationen
Löschen Sie die vorhandenen Eingabeparameter und fügen Sie nur den Eingabeparameter „Benutzername“ („username“) in den Eingabebereich unten auf der Seite hinzu. Als Nächstes versehen Sie diesen mit einem Eingabewert, beispielsweise „bright_data“. Führen Sie dann den Code aus, indem Sie auf die Schaltfläche „Vorschau“(preview) klicken:
Die Ergebnisse sehen wie folgt aus:
Hier finden Sie die detaillierte JSON-Antwort als Beispiel:
{
"profile_name": "Bright Data",
"isVerified": false,
"bio": "The World's #1 Web Data Platform",
"location": "We're everywhere!",
"following": 981,
"followers": 3970,
"website_url": "brdta.com/2VQYSWC",
"posts": 1749,
"media_count": 848,
"profile_background_image_url": "https://pbs.twimg.com/profile_images/1372153221146411008/U_ua34Q5_normal.jpg",
"handle": "bright_data",
"collected_number_of_posts": 40,
"posts_info": [
{
"text": "This week we will sponsor and attend @neudatalab's London Data Summit 2023. @omri_orgad, our CCO, will also participate in a panel discussion on the impact of artificial intelligence on the financial services industry. \nWe look forward to seeing you there! \n#ai #financialservices https://t.co/YtVOK4NuKY",
"time": "Mon Mar 27 14:31:22 +0000 2023",
"id": "1640360870143315969",
"replies": 0,
"retweets": 1,
"likes": 2,
"hashtags": "[object Object],[object Object]",
"tagged_users": "[object Object],[object Object]",
"isRetweeted": false,
"views": "386"
},
{
"text": "Is our Web Unlocker capable of bypassing multiple anti-bot solutions? That's the question that @webscrapingclub sought to answer! \nIn their latest blog post, they share their hands-on, step-by-step challenge and their conclusions.\nRead here: https://t.co/VwxcxGMLWm",
"time": "Thu Mar 23 11:35:32 +0000 2023",
"id": "1638867069587566593",
"replies": 0,
"retweets": 2,
"likes": 3,
"hashtags": "",
"tagged_users": "[object Object]",
"isRetweeted": false,
"views": "404"
},
]
}
Zusätzlich zu den Web-Scraping-Funktionen bietet Bright Data Social-Media-Datensätze, die stark angereicherte Informationen enthalten, die auf Daten von Social-Media-Websites wie Twitter basieren. Nutzen Sie sie, um mehr über Ihre Zielgruppe zu erfahren, Trends aufzuspüren, aufstrebende Influencer zu identifizieren und vieles mehr!
Fazit
In diesem Artikel haben Sie gelernt, wie Sie mit Selenium Twitter-Daten scrapen können. Es ist zwar möglich, Daten auf diese Weise zu scrapen, aber nicht ideal, da dies kompliziert und zeitaufwändig sein kann. Aus diesem Grund haben Sie auch gelernt, wie Sie Bright Data – eine einfachere Lösung für das Scrapen von Twitter-Daten – verwenden können.