Wie man Reddit mit Python ausschöpft

Bemerkungen: 0

Das Scraping Reddit bietet eine Fülle von Informationen zu Trendthemen, Engagement in der Gemeinschaft und beliebten Posts. Obwohl die offizielle API von Reddit ein gemeinsames Instrument für den Zugriff auf solche Inhalte ist, kann das Schaber einschränken, indem es eine größere Flexibilität bei der Datenauswahl bietet. In diesem Tutorial wird Sie mit der asynchronen Dramatiker -Bibliothek zur Verwaltung dynamischer Inhalte und der LXML -Bibliothek verwendet, um die Daten zu extrahieren und einen umfassenden Ansatz zum Abkratzen von Reddit zu ermöglichen.

Schritt 1: Einrichten der Umgebung

Stellen Sie vor dem Start sicher, dass Sie Python installiert haben und die erforderlichen Bibliotheken:

pip install playwright
pip install  lxml

Nach der Installation der erforderlichen Bibliotheken müssen Sie die Dramatiker -Browser -Binärdateien installieren:

playwright install

Um einfach Chrombrowser zu installieren, verwenden Sie den folgenden Befehl:

Playwright install chromium

Diese Tools helfen uns, mit Reddits dynamischem Inhalt zu interagieren, die HTML zu analysieren und die erforderlichen Daten zu extrahieren.

Schritt 2: Seiteninhalte mit Dramatikern abrufen

Dramatiker ist ein leistungsstarkes Tool, mit dem wir einen Browser steuern und wie ein menschlicher Benutzer mit Webseiten interagieren können. Wir werden es verwenden, um die Reddit -Seite zu laden und den HTML -Inhalt zu erhalten.

Hier ist der asynchronisierte Dramatiker, um die Reddit -Seite zu laden:

import asyncio
from playwright.async_api import async_playwright

async def fetch_page_content():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week")
        page_content = await page.content()
        await browser.close()
        return page_content

# Abrufen Sie den Seiteninhalt ab
page_content = asyncio.run(fetch_page_content())

Beim Kratzen können Sie auf Probleme wie die Ratenbeschränkung oder die IP -Blockierung stoßen. Um diese zu mildern, können Sie Proxys verwenden, um Ihre IP -Adresse und benutzerdefinierte Header zu drehen, um das echte Benutzerverhalten nachzuahmen.

Verwenden von Proxys

Beim Kratzen können Sie auf Probleme wie die Ratenbeschränkung oder die IP -Blockierung stoßen. Um diese zu mildern, können Sie Proxys verwenden, um Ihre IP -Adresse und benutzerdefinierte Header zu drehen, um das echte Benutzerverhalten nachzuahmen. Proxys können verwendet werden, um IP -Adressen zu drehen und Erkennung zu vermeiden. Dies kann von Ihrem Dienstleister behandelt werden, um sicherzustellen, dass sie einen IP -Pool verwalten und nach Bedarf drehen.

async def fetch_page_content_with_proxy():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=True, proxy={
            "server": "http://proxy-server:port",
            "username": "your-username",
            "password": "your-password"
        })
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
        page_content = await page.content()
        await browser.close()
        return page_content

Schritt 3: HTML -Inhalt mit LXML analysieren

Sobald wir den HTML -Inhalt haben, besteht der nächste Schritt darin, ihn zu analysieren und die relevanten Daten mit LXML zu extrahieren.

from lxml import html

# Analysieren Sie den HTML -Inhalt
parser = html.fromstring(page_content)

Identifizierung der Elemente zum Kratzen

Die Top -Beiträge zum R/Technology Subreddit von Reddit sind in Artikelelementen enthalten. Diese Elemente können unter Verwendung des folgenden XPaths angezeigt werden:

# Einzelpostelemente extrahieren
elements = parser.xpath('//article[@class="w-full m-0"]')

Verwenden von XPath für die Datenextraktion

XPath ist ein robustes Werkzeug zum Navigieren und Auswählen von Knoten aus einem HTML -Dokument. Wir werden es verwenden, um den Titel, den Link und das Tag aus jedem Beitrag zu extrahieren.

Hier sind die spezifischen XPaths für jeden Datenpunkt:

Title: @aria-label
Link: .//div[@class="relative truncate text-12 xs:text-14 font-semibold mb-xs "]/a/@href
Tag: .//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4 relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()

Schritt 4: Daten extrahieren von jedem Beitrag

Nachdem wir die Elemente angegriffen haben, können wir jeden Beitrag über jeden Beitrag wiederholen und die erforderlichen Daten extrahieren.

posts_data = []

# Über jedes Postelement iterieren
for element in elements:
    title = element.xpath('@aria-label')[0]
    link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold  mb-xs "]/a/@href')[0]
    tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4  relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
    
    post_info = {
        "title": title,
        "link": link,
        "tag": tag
    }
    
    posts_data.append(post_info)

Schritt 5: Speichern Sie die Daten als JSON

Nach dem Extrahieren der Daten müssen wir sie in einem strukturierten Format speichern. JSON ist zu diesem Zweck ein weit verbreitetes Format.

import json

# Speichern Sie die Daten in einer JSON -Datei
with open('reddit_posts.json', 'w') as f:
    json.dump(posts_data, f, indent=4)

print("Data extraction complete. Saved to reddit_posts.json")

Vollständiger Code

Hier ist der komplette Code für das Abkratzen von Reddits Top -Posts aus R/Technologie und das Speichern der Daten als JSON:

import asyncio
from playwright.async_api import async_playwright
from lxml import html
import json

async def fetch_page_content():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=True, proxy={
            "server": "IP:port",
            "username": "your-username",
            "password": "your-password"
        })
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
        page_content = await page.content()
        await browser.close()
        return page_content

# Abrufen Sie den Seiteninhalt ab
page_content = asyncio.run(fetch_page_content())

# Analysieren Sie den HTML -Inhalt mit LXML
parser = html.fromstring(page_content)

# Einzelpostelemente extrahieren
elements = parser.xpath('//article[@class="w-full m-0"]')

# Initialisieren Sie eine Liste, um die extrahierten Daten zu halten
posts_data = []

# Über jedes Postelement iterieren
for element in elements:
    title = element.xpath('@aria-label')[0]
    link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold  mb-xs "]/a/@href')[0]
    tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4  relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
    
    post_info = {
        "title": title,
        "link": link,
        "tag": tag
    }
    
    posts_data.append(post_info)

# Speichern Sie die Daten in einer JSON -Datei
with open('reddit_posts.json', 'w') as f:
    json.dump(posts_data, f, indent=4)

print("Data extraction complete. Saved to reddit_posts.json")

Diese Methode ermöglicht das Abkratzen über verschiedene Subreddits und sammelt aufschlussreiche Informationen aus den reichen Diskussionen in Reddit -Gemeinschaften. Es ist wichtig, rotierende Proxys zu verwenden, um das Erkennungsrisiko durch Reddit zu minimieren. Die Verwendung von mobilen und privaten dynamischen Proxys, die den höchsten Online -Vertrauensfaktor besitzen, stellt sicher, dass Daten gesammelt werden können, ohne Captchas oder Blöcke auszulösen, wodurch ein reibungsloseres Kratzerlebnis erleichtert wird.

Bemerkungen:

0 Bemerkungen