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ư:
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.
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.
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:
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:
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
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.
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:
nhập csv nhập thời gian nhập yêu cầu từ bs4 nhập BeautifulSoup
Để 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",
}
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)
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ể Và 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ề.
Đã đế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}")
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ẻ!