Wie man mit Python Instagram-Daten abgreift

Bemerkungen: 0

Der Zugriff auf Instagram-Daten kann aufgrund verschiedener Anti-Bot-Mechanismen, Anmeldeanforderungen und Ratenbeschränkungen schwierig sein. Mit den richtigen Tools und Techniken können Sie jedoch nützliche Informationen aus öffentlichen Profilen extrahieren. In diesem Artikel erfahren Sie, wie Sie mit Python Instagram-Nutzerdaten auslesen können, indem Sie API-Anfragen an das Backend von Instagram stellen, Informationen aus den zurückgegebenen JSON-Daten extrahieren und diese in einer JSON-Datei speichern.

Einrichten der erforderlichen Bibliotheken

Bevor wir uns dem Code widmen, sollten Sie sicherstellen, dass Sie die erforderlichen Python-Bibliotheken installiert haben.


pip install requests python-box

  • Abfragen: Um HTTP-Anfragen zu stellen.
  • python-box: Vereinfacht den Datenzugriff, indem Wörterbücher in Objekte umgewandelt werden, die den Zugriff mit der Punktnotation ermöglichen.

Zum besseren Verständnis unterteilen wir den Code in verschiedene Abschnitte, darunter das Senden der Anfrage, das Abrufen und Parsen der Daten, die Verwendung von Proxies zur Vermeidung von Erkennung und die Vereinfachung des JSON-Parsens mit der Box-Bibliothek.

Schritt 1. Erstellen der API-Anfrage

Das Frontend von Instagram ist stark gesichert, aber das Backend bietet API-Endpunkte, die ohne Authentifizierung verwendet werden können. Wir werden in Zukunft einen dieser Punkte verwenden.

Diese API liefert detaillierte Informationen über das Profil eines Nutzers, einschließlich seiner Beschreibung, Followerzahl und Beiträge. Sehen wir uns an, wie man mit der requests-Bibliothek in Python Daten anfordert.

Erläuterung:

  1. Header: Instagram blockiert die meisten Bot-Anfragen, indem es die Header der Anfragen analysiert. Die x-ig-app-id ist wichtig, weil sie eine Anfrage imitiert, die von der Instagram-App selbst kommt.
  2. Der User-Agent-String steht für den Browser, der die Anfrage stellt, und täuscht Instagram vor, dass es sich um einen echten Nutzer handelt.
  3. Backend-API-Anfrage: Die URL https://i.instagram.com/api/v1/users/web_profile_info/?username={username} ist Teil der Backend-API von Instagram. Sie liefert detaillierte Informationen über ein öffentliches Profil.
  4. Verarbeitung der JSON-Antwort: Wir verwenden response.json(), um die API-Antwort in ein JSON-Objekt zu konvertieren, das wir leicht parsen und Informationen daraus extrahieren können.

import requests

# Definieren Sie Header, um eine echte Browser-Anfrage zu imitieren
headers = {
    "x-ig-app-id": "936619743392459",  # Instagram-App-ID zur Authentifizierung der Anfrage
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9,ru;q=0.8",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept": "*/*",
}

# Ersetzen Sie dies durch den Benutzernamen, den Sie abrufen möchten
username = 'testtest'

# Senden einer API-Anfrage zum Abrufen von Profildaten
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers)
response_json = response.json()  # Parsen der Antwort in ein JSON-Objekt

Schritt 2. Umgang mit Proxys zur Umgehung der Ratenbeschränkung

Da Instagram wiederholte Anfragen von derselben IP-Adresse einschränkt, ist die Verwendung von Proxys für umfangreiches Scraping unerlässlich. Ein Proxy leitet Ihre Anfragen über verschiedene IP-Adressen um und hilft Ihnen so, nicht entdeckt zu werden.

Um einen Proxy-Server einzurichten, benötigen Sie die IP-Adresse, die Portnummer und bei Bedarf einen Benutzernamen und ein Passwort zur Authentifizierung.


proxies = {
    'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
    'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}

response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers, proxies=proxies)

Schritt 3. Vereinfachtes JSON-Parsing mit Box

Die API von Instagram gibt eine komplexe, verschachtelte JSON-Struktur zurück, die mit einem herkömmlichen, auf Wörterbüchern basierenden Zugriff schwer zu navigieren ist. Um das Parsen zu vereinfachen, können wir die Box-Bibliothek verwenden, die den Zugriff auf JSON-Daten mit der Punktnotation anstelle von Wörterbuchschlüsseln ermöglicht.

Erläuterung:

  1. Box: Diese Bibliothek wandelt ein JSON-Wörterbuch in ein Objekt um und ermöglicht den Zugriff auf tief verschachtelte Felder mittels Punktnotation. Anstatt zum Beispiel response_json['data']['user']['full_name'] zu schreiben, können wir einfach response_json.data.user.full_name schreiben.
  2. Daten extrahieren: Wir extrahieren nützliche Profilinformationen wie den vollständigen Namen des Benutzers, die ID, die Biografie, ob es sich um ein geschäftliches oder professionelles Konto handelt, den Verifizierungsstatus und die Anzahl der Follower.

from box import Box

response_json = Box(response.json())

# Benutzerprofildaten extrahieren
user_data = {
    'full name': response_json.data.user.full_name,
    'id': response_json.data.user.id,
    'biography': response_json.data.user.biography,
    'business account': response_json.data.user.is_business_account,
    'professional account': response_json.data.user.is_professional_account,
    'category name': response_json.data.user.category_name,
    'is verified': response_json.data.user.is_verified,
    'profile pic url': response_json.data.user.profile_pic_url_hd,
    'followers': response_json.data.user.edge_followed_by.count,
    'following': response_json.data.user.edge_follow.count,
}

Schritt 4. Extrahieren von Video- und Zeitreihendaten

Sobald die Profildaten extrahiert sind, können wir auch Daten aus der Video-Timeline und den regelmäßigen Beiträgen des Nutzers auslesen.

Erläuterung:

  1. Videodaten: Dieser Abschnitt extrahiert Daten über die Instagram-Videos des Nutzers, einschließlich der Video-URL, der Anzahl der Aufrufe, der Anzahl der Kommentare und der Dauer des Videos.
  2. Timeline Media: Auch dieser Abschnitt extrahiert Daten aus der Timeline des Nutzers und erfasst die Medien-URL des Posts, Likes und Kommentare.

# Videodaten extrahieren
profile_video_data = []
for element in response_json.data.user.edge_felix_video_timeline.edges:
    video_data = {
        'id': element.node.id,
        'short code': element.node.shortcode,
        'video url': element.node.video_url,
        'view count': element.node.video_view_count,
        'comment count': element.node.edge_media_to_comment.count,
        'like count': element.node.edge_liked_by.count,
        'duration': element.node.video_duration,
    }
    profile_video_data.append(video_data)

# Extrahieren von Zeitachsen-Mediendaten (Fotos und Videos)
profile_timeline_media_data = []
for element in response_json.data.user.edge_owner_to_timeline_media.edges:
    media_data = {
        'id': element.node.id,
        'short code': element.node.shortcode,
        'media url': element.node.display_url,
        'comment count': element.node.edge_media_to_comment.count,
        'like count': element.node.edge_liked_by.count,
    }
    profile_timeline_media_data.append(media_data)

Schritt 5. Abspeichern der Daten in JSON-Dateien

Sobald Sie alle Daten extrahiert haben, besteht der nächste Schritt darin, sie in einer JSON-Datei für die weitere Analyse oder Speicherung zu speichern. Wir verwenden das json-Modul von Python, um die extrahierten Daten in JSON-Dateien zu schreiben. Jede Datei wird dank des Parameters indent=4 sauber formatiert, was das Lesen und Verarbeiten der Daten erleichtert.


import json

# Benutzerdaten in einer JSON-Datei speichern
with open(f'{username}_profile_data.json', 'w') as file:
    json.dump(user_data, file, indent=4)

# Videodaten in einer JSON-Datei speichern
with open(f'{username}_video_data.json', 'w') as file:
    json.dump(profile_video_data, file, indent=4)

# Speichern von Timeline-Mediendaten in einer JSON-Datei
with open(f'{username}_timeline_media_data.json', 'w') as file:
    json.dump(profile_timeline_media_data, file, indent=4)

Kompletter Code

Hier ist das vollständige Python-Skript, das alle zuvor besprochenen Abschnitte kombiniert. Dieser Code sammelt Benutzerprofildaten, Videodaten und Timeline-Mediendaten von Instagram, verarbeitet die erforderlichen Header und Proxys und speichert die extrahierten Informationen in JSON-Dateien.


import requests
from box import Box
import json

# Header zur Nachahmung einer echten Browser-Anfrage an die Backend-API von Instagram
headers = {
    "x-ig-app-id": "936619743392459", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9,ru;q=0.8",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept": "*/*",
}

# Einrichten eines Proxys, um Ratenbeschränkung und Erkennung zu vermeiden (optional)
proxies = {
    'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
    'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}

# Der zu scrapender Instagram-Benutzername
username = 'testtest'

# Senden Sie eine Anfrage an die Backend-API von Instagram, um Profildaten zu erhalten
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', 
                        headers=headers, proxies=proxies)
response_json = Box(response.json())  # Konvertieren Sie die Antwort in ein Box-Objekt für eine einfache Navigation

# Benutzerprofildaten extrahieren
user_data = {
    'full name': response_json.data.user.full_name,
    'id': response_json.data.user.id,
    'biography': response_json.data.user.biography,
    'business account': response_json.data.user.is_business_account,
    'professional account': response_json.data.user.is_professional_account,
    'category name': response_json.data.user.category_name,
    'is verified': response_json.data.user.is_verified,
    'profile pic url': response_json.data.user.profile_pic_url_hd,
    'followers': response_json.data.user.edge_followed_by.count,
    'following': response_json.data.user.edge_follow.count,
}

# Extrahieren von Videodaten aus der Videozeitleiste des Benutzers
profile_video_data = []
for element in response_json.data.user.edge_felix_video_timeline.edges:
    video_data = {
        'id': element.node.id,
        'short code': element.node.shortcode,
        'video url': element.node.video_url,
        'view count': element.node.video_view_count,
        'comment count': element.node.edge_media_to_comment.count,
        'like count': element.node.edge_liked_by.count,
        'duration': element.node.video_duration,
    }
    profile_video_data.append(video_data)

# Extrahieren von Timeline-Mediendaten (Fotos und Videos)
profile_timeline_media_data = []
for element in response_json.data.user.edge_owner_to_timeline_media.edges:
    media_data = {
        'id': element.node.id,
        'short code': element.node.shortcode,
        'media url': element.node.display_url,
        'comment count': element.node.edge_media_to_comment.count,
        'like count': element.node.edge_liked_by.count,
    }
    profile_timeline_media_data.append(media_data)

# Benutzerprofildaten in einer JSON-Datei speichern
with open(f'{username}_profile_data.json', 'w') as file:
    json.dump(user_data, file, indent=4)
print(f'saved json: {username}_profile_data.json')

# Videodaten in einer JSON-Datei speichern
with open(f'{username}_video_data.json', 'w') as file:
    json.dump(profile_video_data, file, indent=4)
print(f'saved json: {username}_video_data.json')

# Speichern von Timeline-Mediendaten in einer JSON-Datei
with open(f'{username}_timeline_media_data.json', 'w') as file:
    json.dump(profile_timeline_media_data, file, indent=4)
print(f'saved json: {username}_timeline_media_data.json')

Das Scraping von Instagram-Daten mit Python kann durch die Nutzung der von Instagram bereitgestellten Backend-API erfolgen, wodurch einige der Front-End-Einschränkungen umgangen werden können. Die Verwendung der richtigen Header zur Nachahmung des Browserverhaltens und der Einsatz von Proxys zur Vermeidung von Ratenbeschränkungen sind entscheidende Schritte. Die Box-Bibliothek vereinfacht den Prozess weiter, indem sie das JSON-Parsing mit der Punktnotation intuitiver gestaltet. Bevor Sie mit dem Scraping von Instagram im großen Stil beginnen, sollten Sie die Nutzungsbedingungen von Instagram beachten und sicherstellen, dass Ihre Scraping-Aktivitäten nicht gegen die Richtlinien von Instagram verstoßen.

Bemerkungen:

0 Bemerkungen