Guida allo scraping di Craigslist con Python

Commenti: 0

Craigslist è ancora una piattaforma importante per accedere a specifici annunci nel panorama digitale attuale. L'uso di Python per semplificare l'estrazione dei dettagli dagli annunci si rivela molto utile. Le operazioni di scraping web sono rese possibili dall'adattabilità e dalle solide librerie di Python, come Requests o BeautifulSoup. Questa guida si addentra nel regno dello scraping di Craigslist con Python, evidenziando l'utilizzo di BeautifulSoup e Requests per l'estrazione dei contenuti, insieme alla rotazione dei proxy per superare efficacemente le difese anti-bot.

Passi fondamentali per lo scraping di Craigslist con Python

Successivamente, esamineremo passo per passo il processo di scraping, a partire dall'invio di richieste HTTP e dall'estrazione di elementi specifici della pagina, per finire con il salvataggio dei dati nel formato richiesto.

Impostazione dell'ambiente

È necessario installare le librerie necessarie:


pip install beautifulsoup4
pip install requests

Invio di richieste HTTP alle pagine di Craigslist

Utilizzare la libreria requests per inviare richieste HTTP GET alle pagine degli annunci di Craigslist.


import requests

# Elenco degli URL di Craigslist da raschiare
urls = [
    "link",
    "link"
]

for url in urls:
    # Inviare una richiesta GET all'URL
    response = requests.get(url)
    
    # Controllare se la richiesta è andata a buon fine (codice di stato 200)
    if response.status_code == 200:
        # Estrarre il contenuto HTML dalla risposta
        html_content = response.text
        
    else:
        # Se la richiesta non è andata a buon fine, viene stampato un messaggio di errore con il codice di stato
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Parametrizzare il contenuto HTML con BeautifulSoup

Usare BeautifulSoup per l'analisi dell'HTML e la navigazione tra i contenuti recuperati.


from bs4 import BeautifulSoup

# Iterare ogni URL dell'elenco
for url in urls:
    # Inviare una richiesta GET all'URL
    response = requests.get(url)
    
    # Controllare se la richiesta è andata a buon fine (codice di stato 200)
    if response.status_code == 200:
        # Estrarre il contenuto HTML dalla risposta
        html_content = response.text
        
        # Analizzare il contenuto HTML usando BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Se la richiesta non è andata a buon fine, viene stampato un messaggio di errore con il codice di stato
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Estrazione dei dati con i metodi di BeautifulSoup

Estrarre dati come i titoli e i prezzi degli articoli dagli annunci di Craigslist usando i metodi di BeautifulSoup.


from bs4 import BeautifulSoup

#  Iterare ogni URL dell'elenco
for url in urls:
    # Inviare una richiesta GET all'URL
    response = requests.get(url)
    
    # Controllare se la richiesta è andata a buon fine (codice di stato 200)
    if response.status_code == 200:
        # Estrarre il contenuto HTML dalla risposta
        html_content = response.text
        
        # Analizzare il contenuto HTML usando BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Estrazione di punti dati specifici
        # Trovare il titolo dell'annuncio
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Trova il prezzo dell'annuncio
        price = soup.find('span', class_='price').text.strip()
        
        # Trovare la descrizione dell'annuncio (può contenere più paragrafi)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Stampa dei dati estratti (a scopo dimostrativo)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Se la richiesta fallisce, viene stampato un messaggio di errore con il codice di stato
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Titolo:

1.png

Prezzo:

2.png

Descrizione:

3.png

Salvataggio dei dati di scraping in un file CSV

Una volta estratti i dati, salvarli in un file CSV per ulteriori analisi o per l'integrazione con altri strumenti.


import csv

# Definire il percorso del file CSV e i nomi dei campi
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Scrittura dei dati in un file CSV
try:
    # Aprire il file CSV in modalità di scrittura con codifica UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Crea un oggetto CSV DictWriter con i nomi di campo specificati
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Scrivere la riga di intestazione nel file CSV
        writer.writeheader()
        
        # Iterare ogni elemento nell'elenco scraped_data
        for item in scraped_data:
            # Scrivere ogni elemento come riga nel file CSV
            writer.writerow(item)
        
    # Stampa un messaggio di successo dopo la scrittura dei dati nel file CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # Stampa un messaggio di errore se si verifica un IOError durante la scrittura sul file CSV
    print(f"Error occurred while writing data to {csv_file}")

Gestire i potenziali ostacoli

Craigslist può implementare misure per prevenire lo scraping, come il blocco degli IP o le sfide CAPTCHA. Per mitigare questi problemi, è bene considerare l'utilizzo di proxy e agenti utente a rotazione.

Utilizzo di proxy:

Questo esempio dimostra l'uso di un proxy con autorizzazione dell'indirizzo IP.


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

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

Rotazione dell'utente (User-Agent):


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',
    # Aggiungere altri agenti utente se necessario
]

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

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

Codice completo

Questo script Python completo mostra come integrare diversi componenti per costruire un efficiente scraper di Craigslist che estrae, analizza e recupera dati da più 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()


# Elenco degli URL di Craigslist da raschiare
urls = [
    "link",
    "link"
]

# Agenti utente e proxy
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'},
]

# Elenco per memorizzare i dati di scraping
scraped_data = []

# Eseguire il loop di ogni URL dell'elenco
for url in urls:
    # Ruota l'agente utente per ogni richiesta per evitare il rilevamento
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Utilizzare un proxy diverso per ogni richiesta per evitare il blocco dell'IP.
    proxy = random.choice(proxies)

    try:
        # Inviare la richiesta GET all'URL di Craigslist con intestazioni e proxy
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Controllare se la richiesta è andata a buon fine (codice di stato 200)
        if response.status_code == 200:
            # Analizzare il contenuto HTML della risposta
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Estrarre i dati dall'HTML analizzato
            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

            # Aggiungere i dati scraped come dizionario all'elenco
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Stampa del messaggio di errore se la richiesta fallisce
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Stampa un messaggio di eccezione se si verifica un errore durante lo scraping
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Impostazione del file CSV per l'archiviazione dei dati di scraping
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Scrittura dei dati di scraping in un file CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Scrivere la riga di intestazione nel file CSV
        writer.writeheader()

        # Iterare l'elenco di scraped_data e scrivere ogni elemento nel file CSV
        for item in scraped_data:
            writer.writerow(item)

    # Stampa il messaggio di successo se i dati sono stati salvati con successo
    print(f"Data saved to {csv_file}")
except IOError:
    # Stampa il messaggio di errore se si verifica un IOError durante la scrittura del file CSV
    print(f"Error occurred while writing data to {csv_file}")

Craigslist è importante perché offre un luogo dove trovare annunci che forniscono informazioni utili per esaminare i mercati, trovare contatti e altro. Il web scraping di Craigslist è reso semplice da Python che utilizza librerie come BeautifulSoup e Request. Le tattiche chiave discusse in questo tutorial sono la gestione dei contenuti dinamici e la rotazione dei proxy. Sfruttando Python in modo responsabile, è possibile estrarre informazioni utili dagli annunci di Craigslist, supportando un processo decisionale informato in vari settori.

Commenti:

0 Commenti