Руководство по скрапингу Craigslist с помощью Python

Комментарии: 0

Использование Python для извлечения данных из объявлений Craigslist может значительно упростить и ускорить процесс анализа и обработки информации. Благодаря гибкости и мощным библиотекам, таким как Requests и BeautifulSoup, Python идеально подходит для проведения операций веб-скрапинга. В данном руководстве мы подробно рассмотрим, как использовать эти инструменты для эффективного скрапинга Craigslist, включая методы ротации прокси для обхода антиботовых мер, предпринимаемых платформой. При этом, мы сосредоточимся на извлечении ключевой информации, такой как названия товаров, цены и описания из указанных URL.

Основные шаги скрапинга Craigslist с помощью Python

Далее пошагово рассмотрим процесс скрапинга, начиная с отправки HTTP-запросов и извлечения конкретных элементов страниц, заканчивая сохранением данных в необходимом формате.

Установка необходимых библиотек

Необходимые библиотеки устанавливаются с помощью следующих команд:


pip install beautifulsoup4
pip install requests

Отправка HTTP-запросов на страницы Craigslist

Используйте библиотеку requests для отправки HTTP GET-запросов на страницы с объявлениями Craigslist.



import requests

# Список URL-адресов Craigslist для скрапинга
urls = [
    "link",
    "link"
]

for url in urls:
    # Отправить GET-запрос на URL
    response = requests.get(url)
    
    # Проверить, был ли запрос успешным (код состояния 200)
    if response.status_code == 200:
        # Извлечь HTML-содержимое из ответа
        html_content = response.text
        
    else:
        # Если запрос не удался, вывести сообщение об ошибке с кодом состояния
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Парсинг HTML-содержимого с помощью BeautifulSoup

Используйте BeautifulSoup для парсинга HTML и навигации по полученному контенту.


from bs4 import BeautifulSoup

# Итерация по каждому URL в списке
for url in urls:
    # Отправка GET-запроса на URL
    response = requests.get(url)
    
    # Проверка успешности запроса (код состояния 200)
    if response.status_code == 200:
        # Извлечение HTML-содержимого из ответа
        html_content = response.text
        
        # Парсинг HTML-содержимого с помощью BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Если запрос не удался, вывести сообщение об ошибке с кодом состояния
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Извлечение данных с помощью методов BeautifulSoup

Извлеките данные, такие как названия товаров и цены из объявлений на Craigslist, используя методы BeautifulSoup.



from bs4 import BeautifulSoup

# Итерация по каждому URL в списке
for url in urls:
    # Отправка GET-запроса на URL
    response = requests.get(url)
    
    # Проверка успешности запроса (код состояния 200)
    if response.status_code == 200:
        # Извлечение HTML-содержимого из ответа
        html_content = response.text
        
        # Парсинг HTML-содержимого с помощью BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Извлечение конкретных данных
        # Найти название объявления
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Найти цену объявления
        price = soup.find('span', class_='price').text.strip()
        
        # Найти описание объявления (может содержать несколько параграфов)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Вывод извлеченных данных (для демонстрационных целей)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Если запрос не удался, вывести сообщение об ошибке с кодом состояния
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")


Название:

1.png

Цена:

2.png

Описание:

3.png

Сохранение извлеченных данных в файл CSV

После извлечения данных сохраните их в файл CSV для дальнейшего анализа или интеграции с другими инструментами.



import csv

# Определение пути к файлу CSV и названий полей
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Запись данных в файл CSV
try:
    # Открытие файла CSV в режиме записи с кодировкой UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Создание объекта CSV DictWriter с указанными названиями полей
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Запись заголовочной строки в файл CSV
        writer.writeheader()
        
        # Итерация по каждому элементу в списке scraped data
        for item in scraped_data:
            # Запись каждого элемента в виде строки в файл CSV
            writer.writerow(item)
        
    # Вывод сообщения об успехе после записи данных в файл CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # Вывод сообщения об ошибке, если при записи в файл CSV произошла ошибка ввода-вывода
    print(f"Error occurred while writing data to {csv_file}")

Устранение потенциальных ошибок

Craigslist может принимать меры для предотвращения скрапинга, такие как блокировка IP или вызовы CAPTCHA. Для минимизации этих проблем рассмотрите использование прокси и ротацию User-Agent.

Использование прокси:

В данном примере приведено использование прокси с авторизацией по 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:



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',
    # Добавьте больше user agents по необходимости
]

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

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

Финальная версия кода

Этот комплексный скрипт на Python демонстрирует, как интегрировать различные элементы для создания эффективного скрапера для Craigslist, который извлекает, анализирует и получает данные из нескольких 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()


# Список URL-адресов Craigslist для скрапинга
urls = [
    "link",
    "link"
]

# User-agent и прокси
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'},
]

# Список для хранения извлеченных данных
scraped_data = []

# Цикл по каждому URL в списке
for url in urls:
    # Ротация user-agent для каждого запроса, чтобы избежать обнаружения
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Использование разных прокси для каждого запроса, чтобы избежать блокировки по IP
    proxy = random.choice(proxies)

    try:
        # Отправка GET-запроса на URL Craigslist с использованием заголовков и прокси
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Проверка успешности запроса (код состояния 200)
        if response.status_code == 200:
            # Парсинг HTML-контента ответа
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Извлечение данных из разобранного HTML
            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')  # Извлечение описания

            # Добавление извлеченных данных в виде словаря в список
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Вывод сообщения об ошибке, если запрос не удался
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Вывод сообщения об исключении, если во время скрапинга произошла ошибка
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Настройка файла CSV для сохранения извлеченных данных
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Запись извлеченных данных в файл CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Запись заголовочной строки в файл CSV
        writer.writeheader()

        # Итерация по списку извлеченных данных и запись каждого элемента в файл CSV
        for item in scraped_data:
            writer.writerow(item)

    # Вывод сообщения об успешном сохранении данных
    print(f"Data saved to {csv_file}")
except IOError:
    # Вывод сообщения об ошибке, если при записи в файл CSV произошла ошибка ввода-вывода
    print(f"Error occurred while writing data to {csv_file}")

Craigslist остается значимым ресурсом, предоставляющим доступ к объявлениям, которые могут служить ценным источником информации для анализа рынков, поиска потенциальных клиентов и других целей. Веб-скрапинг Craigslist значительно упрощается благодаря использованию Python и таких библиотек, как BeautifulSoup и Requests. Основные стратегии, описанные в этом руководстве, включают обработку динамического контента и ротацию прокси. Ответственное применение Python позволяет эффективно анализировать данные с Craigslist для принятия обоснованных решений в различных сферах деятельности.

Комментарии:

0 комментариев