Посібник зі скрапінгу 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 Коментаріїв