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.
Bevor wir uns dem Code widmen, sollten Sie sicherstellen, dass Sie die erforderlichen Python-Bibliotheken installiert haben.
pip install requests python-box
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.
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:
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
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)
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:
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,
}
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:
# 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)
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0