Eine wichtige Fähigkeit zur Gewinnung von Daten aus Webseiten ist das Web Scraping. Pinterest und Instagram, die Inhalte durch die Interaktion der Nutzer dynamisch laden, sind Beispiele für diese Art von Websites. Normale Scraping-Methoden sind unzureichend, wenn es um JavaScript-basiertes Material geht. In diesem Artikel werden wir uns mit Playwright als Automatisierungstool befassen, während lxml für die Datenextraktion aus solchen dynamischen Websites verwendet wird, die Javascript benötigen, um ordnungsgemäß zu funktionieren. In diesem Zusammenhang werden wir auch die Verwendung von Proxys in Playwright besprechen, um der Erkennung als Bots zu entgehen. In diesem Tutorial werden wir das Instagram-Profil scrapen, um alle Post-URLs abzurufen, indem wir das Nutzerverhalten simulieren, z. B. das Scrollen und Warten auf das Laden von Posts.
Werkzeuge, die wir in diesem Leitfaden verwenden werden:
Wir werden den Prozess am Beispiel des Scrapens eines Instagram-Profils veranschaulichen, um Post-URLs zu extrahieren und dabei Benutzeraktionen wie das Scrollen durch die Seite und das Warten auf das Laden neuer Daten zu simulieren. Dynamische Websites laden ihre Inhalte asynchron über AJAX-Anfragen, was bedeutet, dass nicht alle Seiteninhalte sofort zugänglich sind.
Bevor wir beginnen, installieren Sie die erforderlichen Pakete:
pip install playwright
pip install lxml
Außerdem müssen Sie den Playwright-Browser installieren:
playwright install
Wir werden Playwright verwenden, um den Browser zu automatisieren, den dynamischen Inhalt von Instagram zu laden und durch die Seite zu scrollen, um weitere Beiträge zu laden. Lassen Sie uns ein grundlegendes Automatisierungsskript erstellen:
Automatisierungsskript (Headless Browser):
import asyncio
from playwright.async_api import async_playwright
async def scrape_instagram():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True) # Headless mode No visual feedback
page = await browser.new_page()
# Besuchen Sie die Profil-URL
await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")
# Klicken Sie auf die Schaltfläche, um weitere Beiträge zu laden
await page.get_by_role("button", name="Show more posts from").click()
# Scrollen Sie die Seite, um dynamische Inhalte zu laden
scroll_count = 5 # Passen Sie dies an, je nachdem, wie oft Sie blättern möchten
for _ in range(scroll_count):
await page.evaluate('window.scrollBy(0, 700);')
await page.wait_for_timeout(3000) # Wait for posts to load
await page.wait_for_load_state("networkidle")
# Abrufen des Seiteninhalts
content = await page.content()
await browser.close()
return content
# Ausführen der asynchronen Funktion
asyncio.run(scrape_instagram())
Sobald der Inhalt geladen ist, können wir lxml verwenden, um das HTML zu analysieren und Daten mit XPath zu extrahieren. In diesem Fall extrahieren wir die URLs aller Beiträge aus dem Profil.
Parsen des Seiteninhalts und Extrahieren der URLs von Beiträgen:
from lxml import html
import json
def extract_post_urls(page_content):
# Parsen des HTML-Inhalts mit lxml
tree = html.fromstring(page_content)
# XPath zum Extrahieren von Post-URLs
post_urls_xpath = '//a[contains(@href, "/p/")]/@href'
# URLs extrahieren
post_urls = tree.xpath(post_urls_xpath)
# Relative URLs in absolute umwandeln
base_url = "https://www.instagram.com"
post_urls = [f"{base_url}{url}" for url in post_urls]
return post_urls
Beispielfunktion zum Speichern extrahierter Daten im JSON-Format:
def save_data(profile_url, post_urls):
data = {profile_url: post_urls}
with open('instagram_posts.json', 'w') as json_file:
json.dump(data, json_file, indent=4)
# Scrapen und Extrahieren von URLs
page_content = asyncio.run(scrape_instagram())
post_urls = extract_post_urls(page_content)
# Speichern Sie die extrahierten URLs in einer JSON-Datei
save_data("https://www.instagram.com/profile name/", post_urls)
Um dynamische Websites zu scrapen, muss man oft einen unendlichen Bildlauf simulieren. In unserem Skript scrollen wir die Seite mit JavaScript:
(window.scrollBy(0, 700))
Und warten Sie mit diesem Befehl, bis neue Inhalte geladen werden:
wait_for_load_state("networkidle")
Instagram hat strenge Ratenbeschränkungen und Anti-Bot-Maßnahmen. Um nicht blockiert zu werden, können Sie Proxys verwenden, um IP-Adressen zu rotieren und Anfragen zu verteilen. Playwright macht es einfach, Proxys in Ihre Scraping-Automatisierung zu integrieren.
Implementierung von Proxys in Playwright:
async def scrape_with_proxy():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
proxy={"server": "http://your-proxy-server:port"}
)
page = await browser.new_page()
await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")
# Kratzen Sie weiter wie bisher...
Playwright unterstützt auch die Übergabe eines Proxys als Benutzername, Passwort und Server (siehe Beispiel unten).
async def scrape_with_proxy():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"}
)
page = await browser.new_page()
await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")
# Kratzen Sie weiter wie bisher...
Proxys helfen dabei, IP-Sperren und CAPTCHA-Herausforderungen zu vermeiden und gewährleisten ein reibungsloses Scraping von datenintensiven oder eingeschränkten Websites wie Instagram.
import asyncio
from playwright.async_api import async_playwright
from lxml import html
import json
# Funktion zur Automatisierung von Browsern und zum Scrapen dynamischer Inhalte mit Proxys
async def scrape_instagram(profile_url, proxy=None):
async with async_playwright() as p:
# Browser mit Proxy einrichten, falls vorhanden
browser_options = {
'headless': True, # Use headed browser to see the action (can set to True for headless mode)
}
if proxy:
browser_options['proxy'] = proxy
# Starten Sie den Browser
browser = await p.chromium.launch(**browser_options)
page = await browser.new_page()
# Besuchen Sie die Instagram-Profilseite
await page.goto(profile_url, wait_until="networkidle")
# Versuchen Sie, auf die Schaltfläche "Weitere Beiträge anzeigen" zu klicken (optional, kann fehlschlagen, wenn die Schaltfläche nicht gefunden wird)
try:
await page.click('button:has-text("Show more posts from")')
except Exception as e:
print(f"No 'Show more posts' button found: {e}")
# Scrollen Sie die Seite, um weitere Beiträge zu laden
scroll_count = 5 # Number of scrolls to load posts
for _ in range(scroll_count):
await page.evaluate('window.scrollBy(0, 500);')
await page.wait_for_timeout(3000) # Wait for new posts to load
await page.wait_for_load_state("networkidle")
# Abrufen des gesamten Seiteninhalts nach dem Scrollen
content = await page.content()
await browser.close() # Close the browser once done
return content
# Funktion zum Parsen des gescrapten Seiteninhalts und Extrahieren von Post-URLs
def extract_post_urls(page_content):
# Parsen des HTML-Inhalts mit lxml
tree = html.fromstring(page_content)
# XPath zum Extrahieren von Post-URLs
post_urls_xpath = '//a[contains(@href, "/p/")]/@href'
# Extrahieren von Post-URLs mit Hilfe des XPath
post_urls = tree.xpath(post_urls_xpath)
# Relative URLs in absolute URLs umwandeln
base_url = "https://www.instagram.com"
post_urls = [f"{base_url}{url}" for url in post_urls]
return post_urls
# Funktion zum Speichern der extrahierten Post-URLs in einer JSON-Datei
def save_data(profile_url, post_urls):
# Strukturierung der Daten im JSON-Format
data = {profile_url: post_urls}
# Speichern der Daten in einer Datei
with open('instagram_posts.json', 'w') as json_file:
json.dump(data, json_file, indent=4)
print(f"Data saved to instagram_posts.json")
# Hauptfunktion zum Ausführen des Scrapers und Speichern der Daten
async def main():
# Definieren Sie die URL des Instagram-Profils
profile_url = "https://www.instagram.com/profile name/"
# Optional können Sie einen Proxy einrichten
proxy = {"server": "server", "username": "username", "password": "password"} # Use None if no proxy is required
# Scrapen der Instagram-Seite mit Proxys
page_content = await scrape_instagram(profile_url, proxy=proxy)
# Extrahieren von Post-URLs aus dem gescrapten Seiteninhalt
post_urls = extract_post_urls(page_content)
# Speichern Sie die extrahierten Post-URLs in einer JSON-Datei
save_data(profile_url, post_urls)
if __name__ == '__main__':
asyncio.run(main())
Während Playwright eine ausgezeichnete Wahl für das Scraping dynamischer Websites ist, können andere Tools für verschiedene Szenarien geeignet sein:
Jedes Tool bietet einzigartige Stärken und kann je nach den spezifischen Bedürfnissen und Bedingungen des Projekts ausgewählt werden.
Für ein erfolgreiches Scraping dynamischer Websites, die aktiv JavaScript- und AJAX-Anfragen verwenden, sind leistungsstarke Tools erforderlich, die effizient mit unendlichem Scrollen und komplexen interaktiven Elementen umgehen können. Eine solche Lösung ist Playwright - ein Tool von Microsoft, das eine vollständige Browser-Automatisierung bietet und damit ideal für Plattformen wie Instagram geeignet ist. In Kombination mit der lxml-Bibliothek für HTML-Parsing vereinfacht Playwright die Datenextraktion erheblich und ermöglicht die Automatisierung von Interaktionen mit Seitenelementen und den Parsing-Prozess ohne manuelle Eingriffe. Darüber hinaus hilft die Verwendung von Proxy-Servern dabei, den Anti-Bot-Schutz zu umgehen und IP-Blockierungen zu verhindern, was stabile und ununterbrochene Scraping-Vorgänge gewährleistet.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Bemerkungen: 0