Cách quét dữ liệu ebay bằng Python

Bình luận: 0

Ebay là một nền tảng trực tuyến nổi tiếng cung cấp cơ hội giao dịch trong một loạt các sản phẩm trong số những người dùng đã đăng ký. Trong hướng dẫn này, chúng tôi sẽ giải thích cách cạo dữ liệu từ danh sách ebay bằng Python. Do đó, chúng tôi sẽ quan tâm đến các chi tiết có sẵn từ chính danh sách cũng như từ việc đi đến từng sản phẩm lần lượt để biết thêm chi tiết tốt.

Yêu cầu

Để bắt đầu, hãy đảm bảo bạn đã cài đặt các thư viện Python sau:

  • Requests: For making HTTP requests.
  • lxml: For parsing HTML content.
  • Pandas: For saving data to a CSV file.

Cài đặt các thư viện này bằng cách sử dụng:


pip install requests lxml pandas

Hiểu cấu trúc url ebay để phân trang

Khi tìm kiếm sản phẩm trên eBay, mỗi URL trang có thể được sửa đổi để điều hướng thông qua các kết quả được phân trang. Ví dụ:

  • Trang 1: https://www.ebay.com/sch/i.html?_nkw=laptop
  • Trang 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

Tham số _PGN được sử dụng để điều hướng qua nhiều trang danh sách, cho phép truy xuất dữ liệu mở rộng. Hãy bắt đầu quá trình cạo.

Bước 1: Gửi yêu cầu đến eBay

Để bắt đầu, chúng tôi sẽ thiết lập các tiêu đề để bắt chước yêu cầu trình duyệt thực, giúp tránh phát hiện và chặn tiềm năng bằng các biện pháp chống BOT của eBay. Sau đó, chúng tôi sẽ gửi một yêu cầu đến trang danh sách để thu thập các liên kết cho từng sản phẩm.


import requests
from lxml.html import fromstring

# Xác định các tiêu đề để mô phỏng một trình duyệt thực
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Yêu cầu tham số cho truy vấn tìm kiếm
params = {
    '_nkw': 'laptop',
}

# Gửi yêu cầu đến trang danh sách ebay
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Bước 2: Phân tích trang danh sách

Trên trang danh sách, chúng tôi sẽ trích xuất các URL cho các sản phẩm riêng lẻ. Điều này cho phép chúng tôi truy cập từng trang sản phẩm để thu thập các chi tiết cụ thể, chẳng hạn như tiêu đề sản phẩm, giá cả, v.v.


# Phân tích trang danh sách để trích xuất các liên kết sản phẩm
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Đầu ra một mẫu của các liên kết được tìm thấy
print("Product Links:", links[:5])  # Display the first five product links

Bước 3: Cạo dữ liệu sản phẩm

Với URL sản phẩm trong tay, chúng tôi sẽ truy cập từng trang sản phẩm và trích xuất các chi tiết sau:

  • Tiêu đề sản phẩm;
  • Giá;
  • Chi phí vận chuyển;
  • Điều kiện sản phẩm;
  • Số lượng có sẵn;
  • Số lượng bán;
  • Tùy chọn thanh toán;
  • Chính sách trả lại.

Tiếp theo, chúng tôi sẽ lặp qua từng liên kết và sử dụng các biểu thức XPath để xác định vị trí thông tin cần thiết trên trang sản phẩm.


product_data = []

for url in links:
    # Gửi yêu cầu đến trang sản phẩm
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Trích xuất dữ liệu bằng cách sử dụng XPath
    try:
        product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
        price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
        shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
        available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
        sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
        payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
        return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        
        # Lưu trữ dữ liệu trong một từ điển
        product_info = {
            'Title': product_title,
            'Price': price,
            'Shipping Cost': shipping_cost,
            'Condition': product_condition,
            'Available Quantity': available_quantity,
            'Sold Quantity': sold_quantity,
            'Payment Options': payment_options,
            'Return Policy': return_policy,
        }
        product_data.append(product_info)
    
    except IndexError as e:
        print(f"An error occurred: {e}")

Bước 4: Lưu dữ liệu vào tệp CSV

Sau khi thu thập dữ liệu, chúng tôi có thể lưu nó vào tệp CSV bằng gấu trúc.


import pandas as pd

# Chuyển đổi dữ liệu thành DataFrame
df = pd.DataFrame(product_data)

# Lưu vào CSV
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Xử lý giới hạn tỷ lệ và bỏ qua phát hiện trên eBay

Ebay sử dụng giới hạn tỷ lệ để ngăn chặn các yêu cầu quá mức. Dưới đây là một vài phương pháp để tránh phát hiện:

  • Sử dụng proxy: Xoay giữa các địa chỉ IP khác nhau.
  • Điều chỉnh khoảng thời gian yêu cầu: Thực hiện sự chậm trễ giữa các yêu cầu.
  • Tác nhân người dùng ngẫu nhiên: Thay đổi chuỗi tác nhân người dùng để tránh phát hiện.

Bằng cách làm theo các thực tiễn tốt nhất này, bạn có thể giảm thiểu rủi ro bị chặn và tiếp tục xóa dữ liệu hiệu quả.

Hoàn thành Mã

Tại đây, mã đầy đủ để cạo dữ liệu eBay và lưu nó vào tệp CSV:


import requests
import random
from lxml.html import fromstring
import pandas as pd

useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']

# Xác định tiêu đề cho yêu cầu
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': random.choice(useragents),
}

# Tìm kiếm tham số truy vấn
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Lấy trang danh sách
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Trích xuất dữ liệu sản phẩm
product_data = []
for url in links:
    product_page_response = requests.get(url, headers=headers, proxies=proxies)
    product_parser = fromstring(product_page_response.text)
    try:
        product_info = {
            'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
            'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
            'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
            'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
            'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
            'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
            'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
            'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        }
        product_data.append(product_info)
    except IndexError:
        continue

# Lưu vào CSV
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Cạo ebay với Python cho phép thu thập dữ liệu hiệu quả trên các sản phẩm, giá cả và xu hướng. Trong hướng dẫn này, chúng tôi đã đề cập đến danh sách cạo, xử lý phân trang, thiết lập các tiêu đề và sử dụng proxy để tránh phát hiện. Hãy nhớ tôn trọng các điều khoản dịch vụ của eBay bằng cách sử dụng các khoảng thời gian yêu cầu có trách nhiệm và xoay vòng proxy. Với các công cụ này, giờ đây bạn có thể dễ dàng thu thập và phân tích dữ liệu eBay để hiểu biết về thị trường. Hạnh phúc cào!

Bình luận:

0 Bình luận