2024年にeBayをスクラップする方法:初心者ガイド

パイソン, ハウツー, 11月21日-2024年5分で読める

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)

プロキシを使用する前に、新しいユーザー名とパスワードでプロキシ変数を更新することを忘れないでください。

eBayのスクラップ方法

私たちの方法は、4つの重要な機能に焦点を当て、プロセスを単純化する:

  • キーワード検索:検索語(例:「ラップトップバッグ」)を入力して、関連する商品を検索します。
  • 商品URLの抽出:検索結果の1ページ目に掲載されている商品のURLを収集し、データ収集を効率化する。
  • 商品情報の抽出各製品URLについて、製品ページに移動して重要な情報を取得する。
  • データの保存抽出されたデータをCSVファイルに保存し、効率的なアクセスと分析を実現します。

前提条件

適切なツールから始めることが重要です。必要なのは

Pythonをインストールする:

開発環境のセットアップ

  • このプロジェクトを置くディレクトリを選択する。クリーンで分離された依存関係を維持するために、仮想環境をセットアップする。
mkdirebay_scraping
cdebay_scraping
python -m venv venv
source env/bin/activate # Windowsの場合: venvScriptseriesactivate
pip install requests bs4

プロキシの設定:

この例では、匿名性を維持し、プライベートIPがブラックリストに載らないように保護するため、 Proxyscrape Residential Proxiesをローテーションで使用します。

スクリプトの説明

ステップ1:ライブラリとプロキシのインポート

このウェブ・スクレイピング・プロジェクトに必要なライブラリをインポートすることから始める:

  • CSV:このモジュールは、CSV形式の表形式データを読み書きするクラスを提供します。これにより、プログラマーは、Excelの好みのフォーマットで簡単にデータを書き込んだり、正確なCSVフォーマットの詳細を知らなくても、Excelによって生成されたファイルからデータを読み込んだりすることができます。
  • Requests:Pythonを使ってHTTPリクエストを送信するモジュールです。
  • BeautifulSoup4は、html構造から必要な情報を抽出するために設計された強力なhtmlパーサーです。

必要な輸入品:

インポートcsv
インポート時間
インポートリクエスト
frombs4importBeautifulSoup

プロキシの設定:

このチュートリアルでは、 Proxyscrape Residential Proxiesを回転させて使用しますが、他のプロキシを使用することもできますし、プロキシを使用しないこともできます。

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

ステップ2:検索結果の取得

まず、このチュートリアルで使用する検索プロセスを説明しましょう。この写真のように、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)

ステップ3:製品情報の抽出

を紹介する。 ゲット・プロダクト・インフォメーション 関数を使用します。この関数は、商品の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

最後に、解析された製品エンティティを辞書に整理し、それを関数が返す。

ステップ4:結果の保存

これらの結果を、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 で当社の高品質プロキシサービスをご検討ください。 家庭用 データセンター用 モバイル用のプロキシが必要な場合も、弊社にお任せください。ウェブスクレイピングプロジェクトを次のレベルに引き上げるために、当社のサービスをチェックしてください!

ハッピー・スクレイピング!