Twitter ist eine beliebte Social-Media-Plattform, die es Benutzern ermöglicht, kurze Nachrichten, sogenannte "Tweets", miteinander zu teilen. Sie ist eine reiche Datenquelle für Forscher, Journalisten und Vermarkter, die häufig Tweets für verschiedene Zwecke sammeln und analysieren möchten.
In dieser Anleitung werden wir Scrapy, ein beliebtes Python-Web-Scraping-Framework, verwenden, um Twitter zu scrapen und Tweets von Benutzerprofilen und Suchergebnissen zu extrahieren. Wir werden die folgenden Themen behandeln:
- Einrichten eines Scrapy-Projekts
- Scrapen von Tweets von Benutzerprofilen
- Scrapen von Tweets aus Suchergebnissen
- Speichern der gescrapten Daten in einer Datenbank oder Datei
Einrichten eines Scrapy-Projekts
Bevor wir mit dem Scrapen von Twitter beginnen können, müssen wir ein Scrapy-Projekt einrichten. Befolgen Sie dazu diese Schritte:
Schritt #1 - Scrapy mit pip
installieren:
pip install scrapy
Schritt #2 - Erstellen Sie ein neues Scrapy-Projekt mit dem Befehl scrapy startproject
:
scrapy startproject twitter_scraper
Dies erstellt ein neues Verzeichnis namens twitter_scraper
mit der Grundstruktur eines Scrapy-Projekts.
Schritt #3 - Erstellen Sie innerhalb des Verzeichnisses twitter_scraper
einen neuen Spider mit dem Befehl scrapy genspider
:
scrapy genspider twitter_spider twitter.com
Dies erstellt einen neuen Spider namens twitter_spider
im Verzeichnis twitter_scraper/spiders
.
Scraping von Tweets aus Benutzerprofilen
Nachdem wir unser Scrapy-Projekt eingerichtet haben, können wir nun damit beginnen, Tweets von Benutzerprofilen zu scrapen. Dazu müssen wir die URL der Profilseite des Benutzers finden, die normalerweise folgendes Format hat:
https://twitter.com/[benutzername]
Zum Beispiel ist die URL von Präsident Bidens Twitter-Profil https://twitter.com/POTUS
.
Um Tweets von einem Benutzerprofil zu scrapen, können wir die start_requests()
Methode unseres Spiders verwenden, um eine Anfrage an die Profilseite des Benutzers zu senden und die Antwort mit der parse()
Methode zu verarbeiten. Hier ist ein Beispiel, wie man dies tun kann:
import scrapy
class TwitterSpider(scrapy.Spider):
name = "twitter_spider"
start_urls = [
"https://twitter.com/POTUS"
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
Dieser Spider sendet eine Anfrage an die Twitter-Profilseite von Präsident Biden und extrahiert den Text aller Tweets auf der Seite mit der css()
Methode und der Pseudo-Klasse ::text
. Anschließend werden die Tweets auf der Konsole ausgegeben.
Um weitere Tweets vom Benutzerprofil zu scrapen, können wir den next_page
-Selektor verwenden, um die URL der nächsten Seite mit Tweets zu finden und eine neue Anfrage an diese URL zu senden. Dies können wir tun, indem wir eine neue parse_page()
Methode hinzufügen und diese von der parse()
Methode aus aufrufen:
import scrapy
class TwitterSpider(scrapy.Spider):
name = "twitter_spider"
start_urls = [
"https://twitter.com/POTUS"
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
# Finde die URL der nächsten Seite mit Tweets
next_page = response.css('.next-page::attr(href)').get()
# Überprüfe, ob es eine nächste Seite gibt
if next_page:
# Sende eine Anfrage an die nächste Seite
yield scrapy.Request(response.urljoin(next_page), callback=self.parse_page)
def parse_page(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
# Finde die URL der nächsten Seite mit Tweets
next_page = response.css('.next-page::attr(href)').get()
# Überprüfe, ob es eine nächste Seite gibt
if next_page:
# Sende eine Anfrage an die nächste Seite
yield scrapy.Request(response.urljoin(next_page), callback=self.parse_page)
Dieser Code wird weiterhin Tweets vom Benutzerprofil scrapen, bis keine weiteren Seiten mit Tweets mehr zu scrapen sind.
Scraping von Tweets aus Suchergebnissen
Neben dem Scraping von Tweets aus Benutzerprofilen können wir auch Tweets aus Suchergebnissen scrapen. Dazu müssen wir die URL der Suchergebnisseite finden, die normalerweise folgendes Format hat:
Beispiel: Die URL einer Suche nach Tweets, die den Begriff "Scrapy" enthalten, ist https://twitter.com/search?q=Scrapy
.
Um Tweets aus Suchergebnissen zu scrapen, können wir die start_requests()
Methode unseres Spiders verwenden, um eine Anfrage an die Suchergebnisseite zu senden und die Antwort mit der parse()
Methode zu verarbeiten. Hier ist ein Beispiel, wie man das machen kann:
import scrapy
class TwitterSpider(scrapy.Spider):
name = "twitter_spider"
start_urls = [
"https://twitter.com/search?q=Scrapy"
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
# Finde die URL der nächsten Seite der Suchergebnisse
next_page = response.css('.next-page::attr(href)').get()
# Überprüfe, ob es eine nächste Seite gibt
if next_page:
# Sende eine Anfrage an die nächste Seite
yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
Dieser Code wird die Tweets von der Suchergebnisseite scrapen und sie auf der Konsole ausgeben.
Um weitere Tweets aus den Suchergebnissen zu scrapen, können wir dieselbe Technik wie zuvor verwenden und eine neue parse_page()
Methode hinzufügen, um die nächste Seite der Ergebnisse zu verarbeiten:
import scrapy
class TwitterSpider(scrapy.Spider):
name = "twitter_spider"
start_urls = [
"https://twitter.com/search?q=Scrapy"
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
# Finde die URL der nächsten Seite der Suchergebnisse
next_page = response.css('.next-page::attr(href)').get()
# Überprüfe, ob es eine nächste Seite gibt
if next_page:
# Sende eine Anfrage an die nächste Seite
yield scrapy.Request(response.urljoin(next_page), callback=self.parse_page)
def parse_page(self, response):
# Extrahiere die Tweets von der Seite
tweets = response.css('.tweet-text::text').getall()
# Drucke die Tweets
for tweet in tweets:
print(tweet)
# Finde die URL der nächsten Seite der Suchergebnisse
next_page = response.css('.next-page::attr(href)').get()
# Überprüfe, ob es eine nächste Seite gibt
if next_page:
# Sende eine Anfrage an die nächste Seite
yield scrapy.Request(response.urljoin(next_page), callback=self.parse_page)
Speichern der gescrapten Daten
Schließlich möchten wir die von Twitter gescrapten Tweets möglicherweise in einer Datenbank oder Datei für spätere Analysen speichern. Es gibt mehrere Möglichkeiten, dies zu tun, je nach Ihren spezifischen Anforderungen.
Hierzu können Sie die Datei settings.py
in Ihrem Scrapy-Projekt ändern und folgende Zeilen hinzufügen:
FEED_FORMAT = "csv"
FEED_URI = "tweets.csv"
Dies speichert die gescrapten Daten in einer CSV-Datei namens tweets.csv
. Sie können ein anderes FEED_FORMAT
und FEED_URI
verwenden, um die Daten in einem anderen Dateiformat und an einem anderen Ort zu speichern.
Eine weitere Möglichkeit ist die Verwendung der Klassen Item
und Pipeline
von Scrapy, um die Daten in einer Datenbank zu speichern. Dazu können Sie eine neue Klasse TweetItem
erstellen, um die Felder Ihrer Tweet-Daten zu definieren, und eine Klasse TweetPipeline
, um die Speicherung der Daten in einer Datenbank zu handhaben. Hier ist ein Beispiel, wie man das macht:
import scrapy
class TweetItem(scrapy.Item):
text = scrapy.Field()
username = scrapy.Field()
date = scrapy.Field()
class TweetPipeline(object):
def process_item(self, item, spider):
# Verbinde mit der Datenbank
conn = sqlite3.connect("tweets.db")
cursor = conn.cursor()
# Füge die Tweet-Daten in die Datenbank ein
cursor.execute("INSERT INTO tweets (text, username, date) VALUES (?, ?, ?)",
(item['text'], item['username'], item['date']))
conn.commit()
return item
Um die Klassen TweetItem
und TweetPipeline
zu verwenden, müssen Sie die Datei settings.py
ändern und sie zur ITEM_PIPELINES
Einstellung hinzufügen:
ITEM_PIPELINES = { 'twitter_scraper.pipelines.TweetPipeline': 300, }
Dies speichert die gescrapten Tweet-Daten in einer SQLite-Datenbank namens tweets.db
. Sie können einen anderen Datenbank-Backend, wie MySQL oder MongoDB, verwenden, indem Sie die Klasse TweetPipeline
entsprechend anpassen.
Ich hoffe, diese Anleitung war hilfreich, um Ihnen zu zeigen, wie Sie Twitter mit Scrapy scrapen können.