Zum Inhalt

Web-Scraping-Pipelines

2. Daten-Scraping und Web-Pipelines

In diesem Abschnitt erfahren Sie, wie Sie öffentliche Webseiten herunterladen, ihren Strukturcode (den DOM-Baum) lesen und sauberen Text oder Links abrufen.

Tools und Bibliotheken

  • requests: Ein standardmäßiges, benutzerfreundliches Tool, mit dem Netzwerkanfragen an Webseiten gesendet werden, um deren rohen HTML-Text herunterzuladen.
  • BeautifulSoup4 (bs4): Eine Parsing-Engine, die unordentlichen HTML-Webcode liest und ihn in einem durchsuchbaren, navigierbaren Baum organisiert.
  • html.parser: Die integrierte, batteriebetriebene Engine, die Python standardmäßig zum Lesen und Analysieren von HTML-Dateien verwendet.

Branchen-Upgrades (was Teams im großen Maßstab nutzen)

Während sich „Requests“ und „BeautifulSoup“ hervorragend für kleinere Aufgaben eignen, werden Produktionsumgebungen, die Millionen von Seiten verarbeiten, auf asynchrone oder Framework-basierte Tools umgestellt.

1. Asynchroner Abruf: httpx & aiohttp

Anstatt darauf zu warten, dass der Download einer Seite abgeschlossen ist, bevor mit der nächsten begonnen wird (synchron), ermöglichen diese Bibliotheken Ihrem Skript, Hunderte von Anfragen gleichzeitig zu senden (asynchron), wodurch Ihre Pipeline drastisch beschleunigt wird.

  • Wie es im Code aussieht (httpx-Beispiel):
import httpx
import asyncio

async def fetch_page(url):
    # 'async with' lets Python pause this specific task while waiting for the network,
    # allowing other URLs to download in the background.
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.status_code

# Running it asynchronously
# status = asyncio.run(fetch_page('[https://httpbin.org/get](https://httpbin.org/get)'))

2. Das vollständige Pipeline-Framework: Scrapy

Scrapy ist nicht nur eine Bibliothek; Es handelt sich um ein leistungsstarkes Web-Scraping-Framework der Enterprise-Klasse, das zum Crawlen großer Websites mit integrierter Datenbereinigung entwickelt wurde.

  • Wie es im Code aussieht:
import scrapy

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['[https://news.ycombinator.com/](https://news.ycombinator.com/)']

    def parse(self, response):
        # Scrapy combines fetching and CSS extraction directly into one clean pipeline
        for title in response.css('.titleline > a'):
            yield {
                'title': title.css('::text').get(),
                'link': title.css('::attr(href)').get()
            }

Kernmethoden und Codebeispiel

  • requests.get(url, headers=headers): Lädt den rohen HTML-Code von einer Website herunter. Wir fügen benutzerdefinierte User-Agent-Header hinzu, damit unser Skript wie ein echter Webbrowser aussieht, sodass Websites uns nicht blockieren.
  • BeautifulSoup(response.text, 'html.parser'): Konvertiert rohen Webcode in eine interaktive Layout-Karte (Document Object Model), die unser Skript leicht lesen kann.
  • soup.select('.class_name') / soup.find_all('tag'): Verwendet CSS-Designselektoren oder direkte HTML-Tags, um genau das zu finden und zu erfassen, was Sie wollen (z. B. die gezielte Ausrichtung auf bestimmte Artikelüberschriften).
  • .get_text(strip=True) & .get('href'): Entfernt die hässlichen Webcode-Tags und hinterlässt sauberen Zeichenfolgentext oder extrahiert Weblink-URLs.
import requests
from bs4 import BeautifulSoup

url = "[https://news.ycombinator.com/](https://news.ycombinator.com/)"
fake_browser_header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}

# Fetch the raw website content safely
response = requests.get(url, headers=fake_browser_header)

# Convert raw text into a searchable DOM tree layout map
soup = BeautifulSoup(response.text, 'html.parser')

# Use CSS Selectors to target precise structural tags (.titleline)
articles = soup.select('.titleline > a')
for link in articles:
    text = link.get_text(strip=True) # Clear away ugly web tag code
    href = link.get('href')          # Isolate the explicit hyperlink attribute
    print(f"Headline: {text} | Link: {href}")