Guide pour l'exploration de Craigslist avec Python

Commentaires: 0

Craigslist est toujours une plateforme importante pour accéder à des petites annonces spécifiques dans la scène numérique actuelle. L'utilisation de Python pour rationaliser l'extraction des détails des annonces s'avère très utile. Les opérations de web scraping productives sont rendues possibles par l'adaptabilité et les solides bibliothèques de Python telles que Requests ou BeautifulSoup. Ce guide se penche sur le domaine du scraping de Craigslist avec Python, en soulignant l'utilisation de BeautifulSoup et de Requests pour l'extraction de contenu, ainsi que la rotation de proxy pour naviguer efficacement dans les défenses anti-bots.

Etapes de base pour scraper Craigslist avec Python

Ensuite, nous allons passer en revue le processus de scraping étape par étape, en commençant par l'envoi de requêtes HTTP et l'extraction d'éléments de page spécifiques, et en terminant par l'enregistrement des données dans le format requis.

Mise en place de votre environnement

Vous devrez installer les bibliothèques nécessaires :


pip install beautifulsoup4
pip install requests

Envoi de requêtes HTTP aux pages de Craigslist

Utilisez la bibliothèque requests pour envoyer des requêtes HTTP GET aux pages de listes Craigslist.


import requests

# Liste des URL de Craigslist à récupérer
urls = [
    "link",
    "link"
]

for url in urls:
    # Envoyer une requête GET à l'URL
    response = requests.get(url)
    
    # Vérifier si la demande a abouti (code de statut 200)
    if response.status_code == 200:
        # Extraire le contenu HTML de la réponse
        html_content = response.text
        
    else:
        # Si la demande a échoué, un message d'erreur est imprimé avec le code d'état
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

L'analyse du contenu HTML avec BeautifulSoup

Utiliser BeautifulSoup pour l'analyse HTML et la navigation dans le contenu récupéré.


from bs4 import BeautifulSoup

# Interroger chaque URL de la liste
for url in urls:
    # Envoyer une requête GET à l'URL
    response = requests.get(url)
    
    # Vérifier si la demande a abouti (code de statut 200)
    if response.status_code == 200:
        # Extraire le contenu HTML de la réponse
        html_content = response.text
        
        # Analyser le contenu HTML à l'aide de BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Si la demande a échoué, un message d'erreur est imprimé avec le code d'état
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Extraire des données en utilisant les méthodes BeautifulSoup

Extraire des données telles que les titres et les prix des articles des listes Craigslist en utilisant les méthodes BeautifulSoup.


from bs4 import BeautifulSoup

# Interroger chaque URL de la liste
for url in urls:
    # Envoyer une requête GET à l'URL
    response = requests.get(url)
    
    # Vérifier si la demande a abouti (code de statut 200)
    if response.status_code == 200:
        # Extraire le contenu HTML de la réponse
        html_content = response.text
        
        # Analyser le contenu HTML à l'aide de BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Extraction de points de données spécifiques
        # Trouver le titre de l'annonce
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Trouver le prix de l'annonce
        price = soup.find('span', class_='price').text.strip()
        
        # Trouver la description de l'annonce (peut contenir plusieurs paragraphes)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Imprimer les données extraites (à des fins de démonstration)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Si la demande échoue, un message d'erreur est imprimé avec le code d'état
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Titre:

1.png

Prix:

2.png

Description:

3.png

Enregistrer des données scrapées dans un fichier CSV

Une fois les données extraites, enregistrez-les dans un fichier CSV en vue d'une analyse plus approfondie ou d'une intégration à d'autres outils.


import csv

# Définir le chemin d'accès au fichier CSV et les noms des champs
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Ecriture de données dans un fichier CSV
try:
    # Ouvrir le fichier CSV en mode écriture avec le codage UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        #  Créer un objet CSV DictWriter avec les noms de champs spécifiés.
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Inscrire la ligne d'en-tête dans le fichier CSV
        writer.writeheader()
        
        # Itérer à travers chaque élément de la liste des données extraites (scraped_data)
        for item in scraped_data:
            # Écrire chaque élément comme une ligne dans le fichier CSV
            writer.writerow(item)
        
    # Imprimer un message de réussite après l'écriture des données dans le fichier CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # Imprimer un message d'erreur si une erreur IOError se produit lors de l'écriture dans le fichier CSV.
    print(f"Error occurred while writing data to {csv_file}")

Faire face aux obstacles potentiels

Craigslist peut mettre en œuvre des mesures pour empêcher le scraping, telles que le blocage d'IP ou les défis CAPTCHA. Pour atténuer ces problèmes, envisagez d'utiliser des proxys et des agents utilisateurs rotatifs.

Utilisation de serveurs mandataires :

Cet exemple démontre l'utilisation d'un proxy avec autorisation d'adresse IP.


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 :


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',
    # Ajouter d'autres agents utilisateurs si nécessaire
]

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

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

Code complet

Ce script Python complet montre comment intégrer différents composants pour construire un scraper Craigslist efficace qui extrait, analyse et récupère des données à partir de plusieurs URL.


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 des URL de Craigslist à récupérer
urls = [
    "link",
    "link"
]

# Agents utilisateurs et proxies
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 de stockage des données extraites
scraped_data = []

# Parcourir en boucle chaque URL de la liste
for url in urls:
    # Rotation de l'agent utilisateur pour chaque demande afin d'éviter la détection
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Utiliser un proxy différent pour chaque demande afin d'éviter le blocage d'IP
    proxy = random.choice(proxies)

    try:
        # Envoyer une requête GET à l'URL de Craigslist avec les en-têtes et le proxy
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Vérifier si la demande a abouti (code de statut 200)
        if response.status_code == 200:
            # Analyse le contenu HTML de la réponse
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Extraire des données du code HTML analysé
            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')  # Extracting description

            # Ajouter à la liste les données extraites sous forme de dictionnaire
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Imprimer un message d'erreur si la demande échoue
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Imprimer un message d'exception si une erreur se produit pendant le raclage
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Configuration d'un fichier CSV pour le stockage des données scannées
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Écrire les données collectées dans un fichier CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Écrire la ligne d'en-tête dans le fichier CSV
        writer.writeheader()

        # Interroger la liste scraped_data et écrire chaque élément dans le fichier CSV
        for item in scraped_data:
            writer.writerow(item)

    # Imprimer un message de réussite si les données sont enregistrées avec succès
    print(f"Data saved to {csv_file}")
except IOError:
    # Impression d'un message d'erreur en cas d'erreur IOError lors de l'écriture dans le fichier CSV
    print(f"Error occurred while writing data to {csv_file}")

Craigslist est important parce qu'il fournit un endroit où nous pouvons trouver des petites annonces qui nous donnent des informations utiles pour examiner les marchés, trouver des pistes entre autres. Le web scraping de Craigslist est facilité par Python en utilisant des librairies telles que BeautifulSoup et Request. Les tactiques clés abordées dans ce tutoriel sont la gestion du contenu dynamique et la rotation des proxies. En utilisant Python de manière responsable, vous pouvez extraire des informations exploitables des listes Craigslist, ce qui vous permettra de prendre des décisions éclairées dans divers domaines.

Commentaires:

0 Commentaires