Cách kiếm tiền trên eBay vào năm 2024: Hướng dẫn dành cho người mới bắt đầu

Python , Cách thực hiện ,21-11-20245 phút đọc

eBay là một trong những thị trường trực tuyến lớn nhất thế giới, lưu trữ hàng triệu sản phẩm thuộc nhiều danh mục khác nhau. Việc thu thập dữ liệu từ eBay có thể vô cùng hữu ích cho các nhiệm vụ như:

  • So sánh giá
  • Phân tích thị trường
  • Theo dõi xu hướng sản phẩm

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tạo một tập lệnh Python đơn giản để tìm kiếm từ khóa, trích xuất thông tin chi tiết về sản phẩm như tiêu đề, giá, tiền tệ, tình trạng còn hàng, đánh giá và xếp hạng, rồi lưu dữ liệu vào tệp CSV . Hướng dẫn này rất phù hợp với người mới bắt đầu muốn học cách thu thập dữ liệu web đúng cách, với các mẹo về việc tôn trọng các điều khoản dịch vụ và sử dụng proxy một cách có trách nhiệm.

Bỏ qua phần giải thích? Đây là mã đầy đủ

Nếu bạn chỉ muốn tìm bản triển khai đầy đủ, đây là tập lệnh Python hoàn chỉnh để thu thập thông tin chi tiết sản phẩm từ eBay bằng proxy. Sao chép và dán vào môi trường của bạn để bắt đầu:

import re
import csv
import time

import requests
from bs4 import BeautifulSoup

proxies = {
    "http": "http://username:[email protected]:6060",
    "https": "http://username:[email protected]:6060",
}

def get_product_information(product_url) -> dict:
    r = requests.get(product_url, proxies=proxies)
    soup = BeautifulSoup(r.text, features="html.parser")

    product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
    product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
    currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

    # locate the element that holds quanity number of product
    quantity_available = soup.find("div", {"class":"x-quantity__availability"})
    if quantity_available is not None:
        # Using regex check if we can locate the strings that holds this number
        regex_pattern = r"\d+\savailable"
        if re.search(regex_pattern, quantity_available.text) is not None:
            quantity_available = re.search(regex_pattern, quantity_available.text).group()
            # After string is located we extract the number by splitting it by space and selecting the first element.
            quantity_available = quantity_available.split(" ")[0]
        else:
            quantity_available = "NA"

    total_reviews = soup.find("span", {"class":"ux-summary__count"})
    if total_reviews is not None:
        total_reviews = total_reviews.text.split(" ")[0]
    else:
        total_reviews = "NA"

    rating = soup.find("span", {"class":"ux-summary__start--rating"})
    if rating is not None:
        rating = rating.text
    else:
        rating = "NA"

    product_info = {
        "product_url": product_url,
        "title": product_title,
        "product_price": product_price,
        "currency": currency,
        "availability": quantity_available,
        "nr_reviews": total_reviews,
        "rating": rating
    }

    return product_info

def save_to_csv(products, csv_file_name="products.csv"):

    # Write the list of dictionaries to a CSV file
    with open(csv_file_name, mode='w', newline='') as csv_file:
        # Create a csv.DictWriter object
        writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

        # Write the header (keys of the dictionary)
        writer.writeheader()

        # Write the rows (values of the dictionaries)
        writer.writerows(products)

    print(f"Data successfully written to {csv_file_name}")

def main(keyword_to_search: str):
    products = []

    r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

    soup = BeautifulSoup(r.text, features="html.parser")
    for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
        item_url = item.find("a").get("href")

        product_info: dict = get_product_information(item_url)
        print(product_info)
        # Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
        time.sleep(2)

        products.append(product_info)
    # save data to csv
    save_to_csv(products)


if __name__ == '__main__':
    keywords = "laptop bag"
    main(keywords)

Hãy nhớ cập nhật biến proxy bằng tên người dùng và mật khẩu mới trước khi sử dụng.

Chúng tôi sẽ thu thập eBay như thế nào

Phương pháp của chúng tôi đơn giản hóa quy trình, tập trung vào bốn chức năng chính:

  • Tìm kiếm theo từ khóa: Khám phá sản phẩm bằng cách nhập từ khóa tìm kiếm (ví dụ: “túi đựng máy tính xách tay”) để tìm kiếm các mặt hàng có liên quan.
  • Trích xuất URL sản phẩm: Thu thập URL của các sản phẩm được liệt kê trên trang đầu tiên của kết quả tìm kiếm để hợp lý hóa việc thu thập dữ liệu.
  • Trích xuất thông tin sản phẩm: Đối với mỗi URL sản phẩm, chúng tôi sẽ điều hướng đến trang sản phẩm để lấy thông tin quan trọng.
  • Lưu dữ liệu: Lưu dữ liệu đã trích xuất vào tệp CSV để truy cập và phân tích hiệu quả.

Điều kiện tiên quyết

Bắt đầu với các công cụ phù hợp là rất quan trọng. Bạn sẽ cần phải:

Cài đặt Python:

Thiết lập môi trường phát triển của bạn:

  • Chọn thư mục bạn muốn đặt dự án này vào. Thiết lập môi trường ảo để duy trì các phụ thuộc sạch và tách biệt.
mkdir ebay_scraping cd ebay_scraping python -m venv venv source env /bin/activate # Trên Windows sử dụng: venv\Scripts\activate pip install requests bs4

Thiết lập Proxy:

Trong ví dụ này, chúng tôi sẽ sử dụng Proxyscrape Residential Proxy luân phiên để duy trì tính ẩn danh và bảo vệ IP riêng tư không bị đưa vào danh sách đen.

Giải thích về kịch bản

Bước 1: Nhập thư viện và proxy

Chúng tôi bắt đầu bằng cách nhập các thư viện cần thiết cho dự án thu thập dữ liệu web này bao gồm:

  • CSV: mô-đun này cung cấp các lớp để đọc và ghi dữ liệu dạng bảng ở định dạng CSV. Nó cho phép lập trình viên dễ dàng ghi dữ liệu ở định dạng ưa thích của Excel hoặc đọc dữ liệu từ các tệp do Excel tạo ra mà không cần biết chi tiết định dạng CSV chính xác.
  • Yêu cầu: mô-đun này cho phép bạn gửi các yêu cầu HTTP bằng Python.
  • BeautifulSoup4 là một trình phân tích cú pháp HTML mạnh mẽ được thiết kế để trích xuất thông tin bạn cần từ một cấu trúc HTML.

Nhập khẩu bắt buộc:

nhập csv nhập thời gian nhập yêu cầu từ bs4 nhập BeautifulSoup

Thiết lập Proxy:

Để giữ cho IP của bạn được riêng tư, do đó giảm thiểu khả năng IP của bạn bị đưa vào danh sách đen của các trang web cụ thể, bạn nên thực hiện các hoạt động thu thập dữ liệu web dưới sự bảo vệ của proxy. Như đã đề cập ở trên, chúng tôi sẽ sử dụng Proxyscrape Residential Proxy luân phiên cho hướng dẫn này nhưng bạn có thể sử dụng các proxy khác hoặc không cần proxy.

proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}

Bước 2: Nhận kết quả tìm kiếm

Chúng ta hãy bắt đầu bằng cách giải thích quy trình tìm kiếm mà chúng ta sẽ sử dụng trong hướng dẫn này. Chúng ta sẽ truy vấn URL eBay bằng từ khóa “laptop bag”, như trong hình này:

Chúng tôi sẽ sử dụng URL được truy vấn để gửi yêu cầu với yêu cầu.get(). Khi chúng tôi nhận được phản hồi, chúng tôi sẽ phân tích nội dung HTML bằng BeautifulSoup (bs4) để trích xuất URL của từng sản phẩm. Hình ảnh bên dưới cho thấy vị trí của từng URL sản phẩm trong HTML.

Liên kết sản phẩm được tìm thấy trong một <div> phần tử với lớp s-item__info xóa sửa. Để trích xuất các liên kết này, chúng tôi sử dụng BeautifulSoup (bs4) để tìm kiếm tất cả <div> các phần tử với lớp cụ thể này. Khi chúng tôi đã xác định được các phần tử này, chúng tôi lặp lại từng phần tử để tìm <a> các yếu tố và trích xuất href thuộc tính chứa URL sản phẩm.

def main(keyword_to_search: str):
   products = []

   r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

   soup = BeautifulSoup(r.text, features="html.parser")
   for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
       item_url = item.find("a").get("href")

       product_info: dict = get_product_information(item_url)
		# Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
       time.sleep(1)

       products.append(product_info)
   # save data to csv
   save_to_csv(products)

Bước 3: Trích xuất thông tin sản phẩm

Giới thiệu lấy_thông_tin_sản_phẩm chức năng. Chức năng này lấy URL sản phẩm làm đầu vào, gửi yêu cầu đến URL đó, sau đó sử dụng BeautifulSoup (bs4) để phân tích thông tin sản phẩm bằng cách sử dụng quy tắc cụ thể mẫu biểu thức chính quy.

def get_product_information(product_url) -> dict:
   r = requests.get(product_url, proxies=proxies)
   soup = BeautifulSoup(r.text, features="html.parser")

   product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
   product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
   currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

   # locate the element that holds quanity number of product
   quantity_available = soup.find("div", {"class":"x-quantity__availability"})
   if quantity_available is not None:
       # Using regex check if we can locate the strings that holds this number
       regex_pattern = r"\d+\savailable"
       if re.search(regex_pattern, quantity_available.text) is not None:
           quantity_available = re.search(regex_pattern, quantity_available.text).group()
           # After string is located we extract the number by splitting it by space and selecting the first element.
           quantity_available = quantity_available.split(" ")[0]
       else:
           quantity_available = "NA"

   total_reviews = soup.find("span", {"class":"ux-summary__count"})
   if total_reviews is not None:
       total_reviews = total_reviews.text.split(" ")[0]
   else:
       total_reviews = "NA"

   rating = soup.find("span", {"class":"ux-summary__start--rating"})
   if rating is not None:
       rating = rating.text
   else:
       rating = "NA"

   product_info = {
       "product_url": product_url,
       "title": product_title,
       "product_price": product_price,
       "currency": currency,
       "availability": quantity_available,
       "nr_reviews": total_reviews,
       "rating": rating
   }

   return product_info

Cuối cùng, chúng tôi sắp xếp các thực thể sản phẩm đã phân tích thành một từ điển, sau đó được hàm trả về.

Bước 4: Lưu kết quả

Đã đến lúc lưu trữ những kết quả này trong tệp CSV bằng Python gốc csv thư viện. Các save_to_csv(sản phẩm) chức năng chấp nhận các sản phẩm như một đầu vào, là danh sách các từ điển chứa thông tin chi tiết về sản phẩm như đã mô tả trước đó. Dữ liệu này sau đó được lưu vào tệp CSV có tên theo tên_tệp_csv đối số, mặc định là "products.csv".

def save_to_csv(products, csv_file_name="products.csv"):

   # Write the list of dictionaries to a CSV file
   with open(csv_file_name, mode='w', newline='') as csv_file:
       # Create a csv.DictWriter object
       writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

       # Write the header (keys of the dictionary)
       writer.writeheader()

       # Write the rows (values of the dictionaries)
       writer.writerows(products)

   print(f"Data successfully written to {csv_file_name}")

Phần kết luận

Trong hướng dẫn này, chúng tôi đã trình bày cách thu thập dữ liệu eBay bằng cách xây dựng một tập lệnh Python tìm kiếm từ khóa, trích xuất thông tin chi tiết về sản phẩm và lưu dữ liệu vào tệp CSV. Quy trình này nêu bật các kỹ thuật thu thập dữ liệu cần thiết như xử lý các thành phần HTML, sử dụng proxy để ẩn danh và tôn trọng các hoạt động thu thập dữ liệu có đạo đức. Tập lệnh này có thể được cải thiện hơn nữa bằng cách kết hợp chức năng phân trang và khả năng xử lý nhiều từ khóa.

Luôn nhớ phải cạo một cách có trách nhiệm, tuân thủ các điều khoản dịch vụ của trang web và sử dụng các công cụ như giới hạn tốc độ để tránh gián đoạn. Để làm cho các tác vụ cạo của bạn đáng tin cậy và hiệu quả hơn, hãy cân nhắc khám phá các dịch vụ proxy chất lượng cao của chúng tôi tại ProxyScrape . Cho dù bạn cần proxy dân dụng , trung tâm dữ liệu hay di động, chúng tôi đều có thể đáp ứng. Hãy xem qua các dịch vụ của chúng tôi để đưa dự án thu thập dữ liệu web của bạn lên một tầm cao mới!

Chúc bạn cạo vui vẻ!