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.

Share this post