Guia para raspar o Craigslist com Python

Comentários: 0

O Craigslist ainda é uma plataforma significativa para acessar anúncios classificados específicos no cenário digital atual. A utilização de Python para simplificar a extração de detalhes dos anúncios revela-se muito útil. A adaptabilidade e a robustez das bibliotecas Python, como Requests ou BeautifulSoup, permitem realizar operações produtivas de raspagem da web. Este guia mergulha no reino do Craigslist scraping com Python, destacando a utilização do BeautifulSoup e Requests para extração de conteúdo, juntamente com a rotação de proxy para navegar nas defesas anti-bot de forma eficaz.

Passos básicos para fazer scraping do Craigslist com Python

Em seguida, passaremos pelo processo de raspagem passo a passo, começando com o envio de solicitações HTTP e extraindo elementos específicos da página, e terminando com o salvamento dos dados no formato necessário.

Configurando seu ambiente

Você precisará instalar as bibliotecas necessárias:


pip install beautifulsoup4
pip install requests

Enviando solicitações HTTP para páginas do Craigslist

Use a biblioteca requests para enviar solicitações HTTP GET para as páginas de listagem do Craigslist.


import requests

# Lista de URLs da Craigslist a serem extraídos
urls = [
    "link",
    "link"
]

for url in urls:
    # Enviar um pedido GET para o URL
    response = requests.get(url)
    
    # Verificar se o pedido foi bem sucedido (código de estado 200)
    if response.status_code == 200:
        # Extrair conteúdo HTML da resposta
        html_content = response.text
        
    else:
        # Se o pedido falhar, imprime uma mensagem de erro com o código de estado
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Parando conteúdo HTML com BeautifulSoup

Use o BeautifulSoup para analisar HTML e navegar pelo conteúdo recuperado.


from bs4 import BeautifulSoup

# Iterar através de cada URL na lista
for url in urls:
    # Enviar um pedido GET para o URL
    response = requests.get(url)
    
    # Verificar se o pedido foi bem sucedido (código de estado 200)
    if response.status_code == 200:
        # Extrair conteúdo HTML da resposta
        html_content = response.text
        
        # Analisar o conteúdo HTML usando BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Se o pedido falhar, imprime uma mensagem de erro com o código de estado
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Extração de dados usando métodos BeautifulSoup

Extraia dados como títulos de itens e preços de listagens do Craigslist usando métodos BeautifulSoup.


from bs4 import BeautifulSoup

# Iterar através de cada URL na lista
for url in urls:
    # Enviar um pedido GET para o URL
    response = requests.get(url)
    
    # Verificar se o pedido foi bem sucedido (código de estado 200)
    if response.status_code == 200:
        # Extrair conteúdo HTML da resposta
        html_content = response.text
        
        # Analisar o conteúdo HTML usando BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Extração de pontos de dados específicos
        # Procurar o título da listagem
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Encontrar o preço do anúncio
        price = soup.find('span', class_='price').text.strip()
        
        # Encontrar a descrição do anúncio (pode conter vários parágrafos)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Imprimir dados extraídos (para fins de demonstração)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Se o pedido falhar, imprime uma mensagem de erro com o código de estado
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Título:

1.png

Preço:

2.png

Descrição:

3.png

Guardar dados extraídos num ficheiro CSV

Depois que os dados forem extraídos, salve-os em um arquivo CSV para análise posterior ou integração com outras ferramentas.


import csv

# Definir o caminho do ficheiro CSV e os nomes dos campos
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Escrever dados num ficheiro CSV
try:
    # Abrir o ficheiro CSV em modo de escrita com codificação UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Criar um objeto CSV DictWriter com os nomes de campo especificados
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Escrever a linha de cabeçalho no ficheiro CSV
        writer.writeheader()
        
        # Iterar através de cada item na lista scraped_data
        for item in scraped_data:
            # Escrever cada item como uma linha no ficheiro CSV
            writer.writerow(item)
        
    # Imprimir uma mensagem de sucesso após a escrita de dados no ficheiro CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # Imprimir uma mensagem de erro se ocorrer um IOError durante a escrita no ficheiro CSV
    print(f"Error occurred while writing data to {csv_file}")

Lidar com potenciais bloqueios de estrada

A Craigslist pode implementar medidas para impedir a raspagem, como o bloqueio de IP ou desafios CAPTCHA. Para atenuar estes problemas, considere a utilização de proxies e agentes de utilizador rotativos.

Usando proxies:

Este exemplo demonstra o uso de um proxy com autorização de endereço IP.


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

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

Rotação 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',
    # Adicionar mais agentes de utilizador conforme necessário
]

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

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

Código completo

Este script Python completo mostra como integrar diferentes componentes para construir um raspador Craigslist eficiente que extrai, analisa e recupera dados de vários URLs.


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()


# Lista de URLs da Craigslist a serem extraídos
urls = [
    "link",
    "link"
]

# Agentes do utilizador e 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'},
]

# Lista para armazenar dados extraídos
scraped_data = []

# Percorrer cada URL da lista
for url in urls:
    # Rodar o agente do utilizador para cada pedido para evitar a deteção
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Utilize um proxy diferente para cada pedido para evitar o bloqueio de IP
    proxy = random.choice(proxies)

    try:
        # Enviar pedido GET para o URL da Craigslist com cabeçalhos e proxy
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Verificar se o pedido foi bem sucedido (código de estado 200)
        if response.status_code == 200:
            # Analisar o conteúdo HTML da resposta
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Extrair dados do HTML analisado
            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

            # Append scraped data as a dictionary to the list
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Imprimir mensagem de erro se o pedido falhar
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Imprimir mensagem de exceção se ocorrer um erro durante a raspagem
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Configuração do ficheiro CSV para armazenar dados extraídos
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Escrever dados extraídos para um ficheiro CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Escrever a linha de cabeçalho no ficheiro CSV
        writer.writeheader()

        # Iterar através da lista scraped_data e escrever cada item no ficheiro CSV
        for item in scraped_data:
            writer.writerow(item)

    # Imprimir mensagem de sucesso se os dados forem guardados com êxito
    print(f"Data saved to {csv_file}")
except IOError:
    # Imprimir mensagem de erro se houver um IOError durante a escrita no ficheiro CSV
    print(f"Error occurred while writing data to {csv_file}")

A Craigslist é importante porque fornece um local onde podemos encontrar anúncios classificados que nos dão informações úteis para examinar mercados, encontrar contactos, entre outros. A raspagem da web do Craigslist é facilitada pelo Python usando bibliotecas como BeautifulSoup e Request. As principais tácticas discutidas neste tutorial são a manipulação de conteúdo dinâmico e a rotação de proxies. Ao utilizar o Python de forma responsável, é possível extrair informações úteis das listagens do Craigslist, apoiando a tomada de decisões informadas em vários domínios.

Comentários:

0 Comentários