eBayは世界最大級のオンラインマーケットプレイスで、様々なカテゴリーにまたがる数百万もの商品を扱っています。eBayのスクレイピングは、以下のようなタスクに役立ちます:
このガイドでは、キーワードを検索し、タイトル、価格、通貨、在庫状況、レビュー、評価などの商品の詳細を抽出し、データをCSVファイルに保存する簡単なPythonスクリプトの作成方法を紹介します。このチュートリアルは、Webスクレイピングを正しい方法で学びたい初心者に最適で、利用規約を尊重し、責任を持ってプロキシを使用するためのヒントがあります。
もし完全な実装をお探しなら、プロキシを使ってeBayから商品詳細をスクレイピングするための完全なPythonスクリプトはこちらです。あなたの環境にコピー&ペーストして始めましょう:
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)
プロキシを使用する前に、新しいユーザー名とパスワードでプロキシ変数を更新することを忘れないでください。
私たちの方法は、4つの重要な機能に焦点を当て、プロセスを単純化する:
適切なツールから始めることが重要です。必要なのは
mkdirebay_scraping
cdebay_scraping
python -m venv venv
source env/bin/activate # Windowsの場合: venvScriptseriesactivate
pip install requests bs4
この例では、匿名性を維持し、プライベートIPがブラックリストに載らないように保護するため、 Proxyscrape Residential Proxiesをローテーションで使用します。
このウェブ・スクレイピング・プロジェクトに必要なライブラリをインポートすることから始める:
インポートcsv
インポート時間
インポートリクエスト
frombs4importBeautifulSoup
このチュートリアルでは、 Proxyscrape Residential Proxiesを回転させて使用しますが、他のプロキシを使用することもできますし、プロキシを使用しないこともできます。
proxies = {
"http": "http://username:[email protected]:6060",
"https": "http://username:[email protected]:6060",
}
まず、このチュートリアルで使用する検索プロセスを説明しましょう。この写真のように、eBayのURLに "ラップトップバッグ "というキーワードでクエリーを行います:
クエリーされたURLを使って、次のようなリクエストを送る。 request.get()
.レスポンスを受け取ったら、BeautifulSoup(bs4)を使ってHTMLコンテンツを解析し、各商品のURLを抽出します。下の画像は、各商品のURLがHTML内のどこにあるかを示しています。
製品リンクは <div>
要素を持つ class s-item__info clearfix
.これらのリンクを抽出するには ビューティフルスープ(bs4) すべての <div>
要素を見つける。これらのエレメントを見つけたら、それぞれのエレメントを反復処理して <a>
要素を抽出し href = "/stock/stock_detail.html?
属性があり、これには商品のURLが含まれます。
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)
を紹介する。 ゲット・プロダクト・インフォメーション
関数を使用します。この関数は、商品のURLを入力として受け取り、そのURLにリクエストを送信し、BeautifulSoup (bs4)を使用して商品情報を解析します。 細則 そして 正規表現.
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
最後に、解析された製品エンティティを辞書に整理し、それを関数が返す。
これらの結果を、Pythonネイティブの シーエスブイ 図書館その save_to_csv(products)
関数が受け付ける 製品 を入力として使用します。この入力は、前述のように製品の詳細を含む辞書のリストです。このデータを csv_ファイル名
引数のデフォルトは "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}")
このチュートリアルでは、キーワードを検索し、商品の詳細を抽出し、データをCSVファイルに保存するPythonスクリプトを作成することで、eBayをスクレイピングする方法を実演しました。このプロセスでは、HTML要素の取り扱い、匿名性のためのプロキシの使用、倫理的なスクレイピングプラクティスの尊重など、スクレイピングに不可欠なテクニックを紹介します。このスクリプトは、ページネーション機能や複数のキーワードを処理する機能を組み込むことで、さらに改良することができる。
常に責任を持ってスクレイピングすること、ウェブサイトの利用規約を守ること、中断を避けるためにレート制限のようなツールを使用することを忘れないでください。スクレイピング作業をより信頼性の高い効率的なものにするために、ProxyScrape で当社の高品質プロキシサービスをご検討ください。 家庭用、 データセンター用、 モバイル用のプロキシが必要な場合も、弊社にお任せください。ウェブスクレイピングプロジェクトを次のレベルに引き上げるために、当社のサービスをチェックしてください!
ハッピー・スクレイピング!