Scraping Craigslist Với Python: Hướng Dẫn Hoàn Chỉnh

21 tháng 10 2024
6 phút đọc
Tóm tắt được tạo bởi AI:

Một nền tảng quảng cáo như Craigslist vẫn giữ nguyên tính quan trọng trong thời đại số. Công cụ thu thập giúp tự động hóa việc trích xuất thông tin từ các quảng cáo, đặc biệt là bằng cách lấy dữ liệu trực tiếp từ các trang web. Nhờ những thư viện linh hoạt và mạnh mẽ như BeautifulSoup và Requests, việc thu thập dữ liệu có thể được thực hiện hiệu quả. Hướng dẫn này tập trung vào scraping Craigslist với Python, làm nổi bật BeautifulSoup, Requests, và xoay vòng proxy để tránh bị phát hiện bot.

Bây giờ, chúng ta sẽ đi từng bước để học cách scrape Craigslist.

Các Bước Cơ Bản Để Scrape Dữ Liệu Craigslist Với Python

Bây giờ chúng ta sẽ đi chi tiết hơn qua các bước web scraping Craigslist, bắt đầu bằng cách gửi các yêu cầu HTTP đến một trang web cụ thể, phân tách trang cần thiết, thu thập dữ liệu mong muốn và lưu nó theo định dạng đã định trước.

Thiết Lập Môi Trường

Các gói sau cần được tải xuống và cài đặt:


pip install beautifulsoup4
pip install requests

Gửi Yêu Cầu HTTP Đến Các Trang Craigslist

Để lấy dữ liệu từ các trang web, trước tiên bạn cần gửi các yêu cầu HTTP đến các URL mà bạn muốn scrape. Sử dụng thư viện requests, bạn có thể gửi các yêu cầu GET để lấy nội dung HTML, sau đó bạn có thể xử lý nội dung đó để trích xuất thông tin mà bạn cần.


import requests

# Danh sách các url craigslist để cạo
urls = [
    "link",
    "link"
]

for url in urls:
    # Gửi yêu cầu nhận đến URL
    response = requests.get(url)
    
    # Kiểm tra xem yêu cầu có thành công không (mã trạng thái 200)
    if response.status_code == 200:
        # Trích xuất nội dung HTML từ phản hồi
        html_content = response.text
        
    else:
        # Nếu yêu cầu không thành công, hãy in thông báo lỗi bằng mã trạng thái
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Phân Tích Nội Dung HTML Bằng BeautifulSoup

Với BeautifulSoup, bạn có thể duyệt qua HTML và chọn ra các phần bạn cần từ Craigslist. Nó cho phép bạn tìm thẻ, lấy văn bản và trích xuất những thứ như liên kết hoặc giá cả. Đây là một cách đơn giản để lấy thông tin hữu ích từ những trang web lộn xộn.


from bs4 import BeautifulSoup

# Lặp lại thông qua từng url trong danh sách
for url in urls:
    # Gửi yêu cầu nhận đến URL
    response = requests.get(url)
    
    # Kiểm tra xem yêu cầu có thành công không (mã trạng thái 200)
    if response.status_code == 200:
        # Trích xuất nội dung HTML từ phản hồi
        html_content = response.text
        
        # Phân tích nội dung HTML bằng cách sử dụng đẹp
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Nếu yêu cầu không thành công, hãy in thông báo lỗi bằng mã trạng thái
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Thu Thập Dữ Liệu Với Thư Viện BeautifulSoup

Sau khi lấy được nội dung HTML, bước tiếp theo là phân tích nó bằng thư viện BeautifulSoup. Sử dụng các hàm, chúng ta thực hiện việc scrape dữ liệu từ Craigslist như các danh sách với tiêu đề và giá của mặt hàng. Nó giống như một công cụ giúp bạn lọc qua mã lộn xộn để nhanh chóng và hiệu quả tìm ra những phần thông tin hữu ích.


from bs4 import BeautifulSoup

# Lặp lại thông qua từng url trong danh sách
for url in urls:
    # Gửi yêu cầu nhận đến URL
    response = requests.get(url)
    
    # Kiểm tra xem yêu cầu có thành công không (mã trạng thái 200)
    if response.status_code == 200:
        # Trích xuất nội dung HTML từ phản hồi
        html_content = response.text
        
        # Phân tích nội dung HTML bằng cách sử dụng đẹp
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Trích xuất các điểm dữ liệu cụ thể
        # Tìm tiêu đề của danh sách
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Tìm giá của danh sách
        price = soup.find('span', class_='price').text.strip()
        
        # Tìm mô tả về danh sách (có thể chứa nhiều đoạn văn)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # In dữ liệu được trích xuất (cho mục đích trình diễn)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Nếu yêu cầu không thành công, hãy in thông báo lỗi bằng mã trạng thái
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Tiêu đề:

1.png

Giá:

2.png

Mô tả:

3.png

Lưu Dữ Liệu Đã Scrape Vào Tệp CSV

Sau khi chúng ta trích xuất dữ liệu từ Craigslist, hãy đảm bảo rằng nó được lưu ở định dạng CSV để thuận tiện cho việc sử dụng hoặc phân tích sau này cũng như tương thích với các ứng dụng khác.


import csv

# Xác định đường dẫn tệp CSV và tên trường
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Viết dữ liệu vào tệp CSV
try:
    # Mở tệp CSV ở chế độ ghi bằng mã hóa UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Tạo một đối tượng CSV Dictwriter với các tên trường được chỉ định
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Viết hàng tiêu đề trong tệp CSV
        writer.writeheader()
        
        # Lặp lại thông qua từng mục trong danh sách Scraped_data
        for item in scraped_data:
            # Viết từng mục dưới dạng một hàng trong tệp CSV
            writer.writerow(item)
        
    # In tin nhắn thành công sau khi ghi dữ liệu vào tệp CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # In một thông báo lỗi nếu ioRror xảy ra trong khi ghi vào tệp CSV
    print(f"Error occurred while writing data to {csv_file}")

Cách Sử Dụng Craigslist API Với Python

Nếu bạn muốn tự động thu thập các danh sách từ trang web Craigslist, một trong những cách dễ nhất là sử dụng API không chính thức thông qua một thư viện. Nó cho phép bạn truy vấn trang, lọc kết quả theo danh mục, thành phố, giá, từ khóa và nhiều hơn nữa.

Bắt đầu bằng cách cài đặt thư viện:


pip install python-craigslist


Dưới đây là một ví dụ đơn giản để tìm thuê căn hộ ở New York:


from craigslist import CraigslistHousing

cl_h = CraigslistHousing(site='newyork', category='apa', filters={'max_price': 2000})
for result in cl_h.get_results(limit=10):
    print(result['name'], result['price'], result['url'])

Mã này lấy 10 danh sách đầu tiên từ mục căn hộ/nhà cho thuê ở thành phố New York, nơi giá dưới 2000 đô la.

Thư viện này cũng hỗ trợ các danh mục khác như việc làm, ô tô, đồ rao bán và nhiều hơn nữa — cùng với nhiều bộ lọc khác nhau. Đây là một công cụ tuyệt vời để nhanh chóng xây dựng các công cụ dựa trên Python, chẳng hạn như bot, công cụ theo dõi danh sách hoặc phân tích thị trường.

Xử Lý Những Trở Ngại Tiềm Ẩn

Có một số thách thức bổ sung mà bạn có thể gặp phải khi web scraping, đặc biệt là với Craigslist. Nó thực hiện chặn IP và thách thức CAPTCHA để ngăn chặn các nỗ lực scraping. Để tránh những vấn đề này, bạn có thể sử dụng proxy cùng với xoay vòng user-agent.

Sử dụng proxy:

Kết hợp sử dụng proxy và xoay vòng user-agent là một cách thông minh để tiếp tục scraping mà không bị phát hiện.


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

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

Xoay vòng user-agent có nghĩa là thay đổi danh tính trình duyệt mà scraper của bạn gửi kèm theo mỗi yêu cầu. Nếu bạn luôn sử dụng cùng một user-agent, nó trông sẽ đáng ngờ. Việc chuyển đổi giữa các user-agent khác nhau khiến scraper của bạn trông giống như người dùng bình thường hơn, giúp tránh bị chặn:


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',
    # Thêm nhiều đại lý người dùng khi cần thiết
]

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

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

Mã Hoàn Chỉnh

Kết hợp tất cả các mô-đun đã được thảo luận trong suốt hướng dẫn này cho phép bạn phát triển một scraper Craigslist bằng Python hoạt động đầy đủ. Chương trình này có thể trích xuất, phân tích và điều hướng qua nhiều URL để lấy dữ liệu cần thiết.


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


# Danh sách các url craigslist để cạo
urls = [
    "link",
    "link"
]

# Đại lý người dùng và 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'},
]

# Liệt kê để lưu trữ dữ liệu cào
scraped_data = []

# Vòng lặp qua từng URL trong danh sách
for url in urls:
    # Xoay đại lý người dùng cho mỗi yêu cầu để tránh phát hiện
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Sử dụng một proxy khác nhau cho mỗi yêu cầu để tránh chặn IP
    proxy = random.choice(proxies)

    try:
        # Gửi yêu cầu đến URL Craigslist với các tiêu đề và proxy
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Kiểm tra xem yêu cầu có thành công không (mã trạng thái 200)
        if response.status_code == 200:
            # Nội dung phân tích HTML của phản hồi
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Trích xuất dữ liệu từ HTML phân tích cú pháp
            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')  # Trích xuất mô tả

            # Nối dữ liệu được quét dưới dạng từ điển vào danh sách
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # In thông báo lỗi nếu yêu cầu không thành công
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # In tin nhắn ngoại lệ nếu xảy ra lỗi trong quá trình cạo
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Thiết lập tệp CSV để lưu trữ dữ liệu đã quét
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Viết dữ liệu được quét vào tệp CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Viết hàng tiêu đề trong tệp CSV
        writer.writeheader()

        # Lặp lại thông qua danh sách Scraped_data và ghi từng mục vào tệp CSV
        for item in scraped_data:
            writer.writerow(item)

    # In tin nhắn thành công nếu dữ liệu được lưu thành công
    print(f"Data saved to {csv_file}")
except IOError:
    # In thông báo lỗi nếu có ioerror trong khi ghi vào tệp csv
    print(f"Error occurred while writing data to {csv_file}")

Scraping Craigslist với Python: Những Suy Nghĩ Cuối Cùng

Bây giờ bạn đã hiểu cách web scraping hoạt động, thật dễ để thấy tại sao nó lại hữu ích — cho dù bạn đang phân tích thị trường hay tìm kiếm khách hàng tiềm năng. Các trang web chứa đầy thông tin giá trị, và các công cụ như BeautifulSoup và Requests giúp việc lấy dữ liệu đó trở nên khá đơn giản. Hướng dẫn này cũng đề cập đến những mẹo quan trọng, như xử lý nội dung động và sử dụng proxy xoay vòng để tránh bị phát hiện. Khi thực hiện đúng cách, scraping với Python thực sự có thể giúp doanh nghiệp và mọi người đưa ra quyết định thông minh hơn trong nhiều lĩnh vực khác nhau.

Nội dung của bài viết:

Các bài viết gần đây

Quay lại blog
Quay lại blog