Craigslist mit Python durchforsten: Eine vollständige Anleitung

Bemerkungen: 0

Eine Anzeigenplattform wie Craigslist bleibt auch im digitalen Zeitalter relevant. Der Collector hilft dabei, die Extraktion von Informationen aus Anzeigen zu automatisieren, insbesondere durch den direkten Bezug von Daten von Websites. Dank flexibler und leistungsstarker Bibliotheken wie BeautifulSoup und Requests kann die Datensammlung effizient durchgeführt werden. In diesem Tutorial geht es um Craigslist-Scraping mit Python, wobei BeautifulSoup, Requests und Proxy-Rotation zur Vermeidung von Bot-Erkennung im Vordergrund stehen.

Wir werden jetzt Schritt für Schritt aufschlüsseln, wie man Craigslist scrapen kann.

Grundlegende Schritte zum Scrapen von Craigslist-Daten mit Python

Jetzt werden wir die Schritte des Web Scraping Craigslist im Detail durchgehen, beginnend mit dem Senden von HTTP-Anfragen an eine bestimmte Webseite, dem Aufteilen der gewünschten Seite, dem Sammeln der gewünschten Daten und dem Speichern in einem vorgegebenen Format.

Einrichten Ihrer Umgebung

Die folgenden Pakete müssen heruntergeladen und installiert werden:


pip install beautifulsoup4
pip install requests

Senden von HTTP-Anfragen an Craigslist-Seiten

Um Daten von Webseiten abzurufen, müssen Sie zunächst HTTP-Anfragen an die URLs senden, die Sie abrufen möchten. Mit der Anforderungsbibliothek können Sie GET-Anforderungen senden, um den HTML-Inhalt abzurufen, den Sie dann verarbeiten können, um die benötigten Informationen zu extrahieren.


import requests

# Liste der Craigslist-URLs zum Scrapen
urls = [
    "link",
    "link"
]

for url in urls:
    # Senden Sie eine GET-Anfrage an die URL
    response = requests.get(url)
    
    # Prüfen, ob die Anfrage erfolgreich war (Statuscode 200)
    if response.status_code == 200:
        # HTML-Inhalt aus der Antwort extrahieren
        html_content = response.text
        
    else:
        # Wenn die Anfrage fehlgeschlagen ist, wird eine Fehlermeldung mit dem Statuscode
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Parsing von HTML-Inhalten mit BeautifulSoup

Mit BeautifulSoup können Sie den HTML-Code durchgehen und die Teile, die Sie benötigen, aus Craigslist heraussuchen. Sie können Tags finden, Text abrufen und Dinge wie Links oder Preise erfassen. Es ist ein einfacher Weg, um nützliche Informationen aus unübersichtlichen Webseiten zu ziehen.


from bs4 import BeautifulSoup

# Iterieren Sie durch jede URL in der Liste
for url in urls:
    # Senden Sie eine GET-Anfrage an die URL
    response = requests.get(url)
    
    # Prüfen, ob die Anfrage erfolgreich war (Statuscode 200)
    if response.status_code == 200:
        # HTML-Inhalt aus der Antwort extrahieren
        html_content = response.text
        
        # Parsen des HTML-Inhalts mit BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Wenn die Anfrage fehlgeschlagen ist, drucken Sie eine Fehlermeldung mit dem Statuscode
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Sammeln von Daten mit der BeautifulSoup-Bibliothek

Nach dem Abrufen des HTML-Inhalts wird dieser im nächsten Schritt mit der BeautifulSoup-Bibliothek geparst. Mithilfe von Funktionen führen wir Craigslist-Daten-Scraping durch, z. B. Auflistungen wie Artikeltitel und Preise. Es ist, als hätte man ein Werkzeug, das einem hilft, den unordentlichen Code zu durchforsten, um die nützlichen Teile schnell und effizient zu finden.


from bs4 import BeautifulSoup

# Iterieren Sie durch jede URL in der Liste
for url in urls:
    # Senden Sie eine GET-Anfrage an die URL
    response = requests.get(url)
    
    # Prüfen, ob die Anfrage erfolgreich war (Statuscode 200)
    if response.status_code == 200:
        # HTML-Inhalt aus der Antwort extrahieren
        html_content = response.text
        
        # Parsen des HTML-Inhalts mit BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Extrahieren bestimmter Datenpunkte
        # Suchen Sie den Titel des Angebots
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Finden Sie den Preis des Angebots
        price = soup.find('span', class_='price').text.strip()
        
        # Suchen Sie die Beschreibung des Angebots (kann mehrere Absätze enthalten)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Extrahierte Daten drucken (zu Demonstrationszwecken)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Wenn die Anfrage fehlschlägt, drucken Sie eine Fehlermeldung mit dem Statuscode
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Titel:

1.png

Preis:

2.png

Beschreibung:

3.png

Speichern von gescrapten Daten in einer CSV-Datei

Nachdem wir die Craigslist-Daten extrahiert haben, stellen Sie sicher, dass sie im CSV-Format gespeichert werden, um die spätere Nutzung oder Analyse zu erleichtern und die Interoperabilität mit anderen Anwendungen zu gewährleisten.


import csv

# Definieren Sie den Pfad zur CSV-Datei und die Feldnamen
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Daten in eine CSV-Datei schreiben
try:
    # Öffnen Sie die CSV-Datei im Schreibmodus mit UTF-8-Kodierung
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Erstellen eines CSV-DictWriter-Objekts mit den angegebenen Feldnamen
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Schreiben Sie die Kopfzeile in die CSV-Datei
        writer.writeheader()
        
        # Iterieren Sie jedes Element in der Liste scraped_data
        for item in scraped_data:
            # Jedes Element als eine Zeile in die CSV-Datei schreiben
            writer.writerow(item)
        
    # Drucken einer Erfolgsmeldung nach dem Schreiben von Daten in die CSV-Datei
    print(f"Data saved to {csv_file}")

except IOError:
    # Ausgabe einer Fehlermeldung, wenn beim Schreiben in die CSV-Datei ein IOError auftritt
    print(f"Error occurred while writing data to {csv_file}")

Wie man die Craigslist Api Python verwendet

Wenn Sie automatisch Angebote von der Craigslist-Website sammeln möchten, ist eine der einfachsten Möglichkeiten, die inoffizielle API über eine Bibliothek zu nutzen. Damit können Sie die Website abfragen und die Ergebnisse nach Kategorie, Stadt, Preis, Schlüsselwörtern und mehr filtern.

Beginnen Sie mit der Installation der Bibliothek:


pip install python-craigslist


Hier ist ein einfaches Beispiel für die Suche nach Mietwohnungen in New York:


from craigslist import CraigslistHousing

cl_h = CraigslistHousing(site='newyork', category='apa', filters={'max_price': 2000})
for result in cl_h.get_results(limit=10):
    print(result['name'], result['price'], result['url'])

Mit diesem Code werden die ersten 10 Angebote aus dem Bereich Wohnungen/Häuser zur Miete in New York City mit einem Preis von unter 2000 $ angezeigt.

Die Bibliothek unterstützt auch Kategorien wie Jobs, Autos, zu verkaufende Artikel und mehr - zusammen mit einer breiten Palette von Filtern. Es ist ein großartiges Werkzeug für die schnelle Erstellung von Python-basierten Tools, wie z. B. Bots, Listing-Tracker oder Marktanalysen.

Umgang mit möglichen Hindernissen

Es gibt eine Reihe zusätzlicher Herausforderungen, denen man beim Web-Scraping begegnen kann, insbesondere bei Craigslist. Es werden IP-Sperren und CAPTCHA-Herausforderungen implementiert, um Scraping-Versuche zu verhindern. Um diese Probleme zu vermeiden, können Sie neben der Rotation des Benutzeragenten auch Proxys implementieren.

Verwendung von Proxys:

Die Verwendung von Proxys und rotierenden Benutzer-Agenten ist ein intelligenter Weg, um Scraping zu betreiben, ohne erwischt zu werden.


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}

response = requests.get(url, proxies=proxies)

User-Agent-Rotation bedeutet, dass Sie die Browser-Identität, die Ihr Scraper bei jeder Anfrage sendet, ändern. Wenn Sie immer denselben Benutzer-Agenten verwenden, wirkt das verdächtig. Wenn Sie zwischen verschiedenen Benutzer-Agenten wechseln, wirkt Ihr Scraper eher wie ein normaler Benutzer, was hilft, Blockierungen zu vermeiden:


import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Bei Bedarf weitere User Agents hinzufügen
]

headers = {
    'User-Agent': random.choice(user_agents)
}

response = requests.get(url, headers=headers)

Vollständiger Code

Die Integration aller in diesem Tutorial besprochenen Module ermöglicht die Entwicklung eines voll funktionsfähigen Python Craigslist Scrapers. Dieses Programm kann eine Reihe von URLs extrahieren, parsen und durch sie navigieren und die benötigten Daten abrufen.


import requests
import urllib3
from bs4 import BeautifulSoup
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Liste der Craigslist-URLs zum Scrapen
urls = [
    "link",
    "link"
]

# Benutzeragenten und Proxys
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
]

proxies = [
    {'http': 'http://your_proxy_ip1:your_proxy_port1', 'https': 'https://your_proxy_ip1:your_proxy_port1'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
]

# Liste zum Speichern der ausgewerteten Daten
scraped_data = []

# Schleife durch jede URL in der Liste
for url in urls:
    # Wechsel des Benutzer-Agenten für jede Anfrage, um eine Entdeckung zu vermeiden
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Verwenden Sie für jede Anfrage einen anderen Proxy, um IP-Sperren zu vermeiden.
    proxy = random.choice(proxies)

    try:
        # GET-Anfrage an die Craigslist-URL mit Headern und Proxy senden
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Prüfen, ob die Anfrage erfolgreich war (Statuscode 200)
        if response.status_code == 200:
            # Parsen des HTML-Inhalts der Antwort
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Daten aus dem geparsten HTML extrahieren
            title = soup.find('span', id='titletextonly').text.strip()
            price = soup.find('span', class_='price').text.strip()
            description = soup.find('section', id='postingbody').get_text(strip=True, separator='\n')  # Beschreibung extrahieren

            # Ausgelesene Daten in Form eines Wörterbuchs an die Liste anhängen
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Fehlermeldung ausgeben, wenn die Anfrage fehlschlägt
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Ausgabe einer Ausnahmemeldung, wenn beim Scrapen ein Fehler auftritt
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Einrichtung einer CSV-Datei zur Speicherung der gescrapten Daten
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Schreiben von ausgewerteten Daten in eine CSV-Datei
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Kopfzeile in die CSV-Datei schreiben
        writer.writeheader()

        # Iterieren Sie die Liste scraped_data und schreiben Sie jedes Element in die CSV-Datei
        for item in scraped_data:
            writer.writerow(item)

    # Erfolgsmeldung ausgeben, wenn die Daten erfolgreich gespeichert wurden
    print(f"Data saved to {csv_file}")
except IOError:
    # Fehlermeldung ausgeben, wenn beim Schreiben in die CSV-Datei ein IOError auftritt
    print(f"Error occurred while writing data to {csv_file}")

Craigslist Scraping mit Python: Abschließende Überlegungen

Jetzt, da Sie wissen, wie Web-Scraping funktioniert, ist es leicht zu erkennen, warum es so praktisch ist - egal, ob Sie Märkte analysieren oder nach Leads suchen. Websites sind vollgepackt mit wertvollen Informationen, und Tools wie BeautifulSoup und Requests machen das Abrufen dieser Daten ziemlich einfach. In diesem Leitfaden werden auch wichtige Tipps gegeben, wie z. B. der Umgang mit dynamischen Inhalten und die Verwendung von rotierenden Proxys, um unter dem Radar zu bleiben. Wenn es richtig gemacht wird, kann Scraping mit Python Unternehmen und Menschen wirklich dabei helfen, in allen möglichen Bereichen intelligentere Entscheidungen zu treffen.

Bemerkungen:

0 Bemerkungen