ebay API & Python キーワード検索をしてウォッチ数を抜き出しCSVに出力する方法

読了時間目安: 2

ebay APIでPythonを使用してキーワード検索をし、ウォッチ数を抜き出しをするコードとCSV出力する方法を解説します。
コードの公開もありますので是非ご覧ください。

この記事が向いている方

  • ebay APIに興味がある
  • pythonに興味がある
  • リサーチを仕組み化したい

それではどうぞ!

使用環境

使用環境はGoogle Colabです。(以下GC)

僕はプログラミングはPythonをちょこっとだけしかできませんが、何もない状態からプログラミングを行うための環境づくりはとても大変です。

しかし、GCは環境作りはないに等しいです。

↓環境作りの詳しい内容はこちら↓

完成コード

とりあえず下記のコードをコピペすればOKです。

#===================モジュールインストール===================
!pip install pandas
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
#===================モジュール===================
import requests
import csv
import re
import time
#===================ebayAPPID===================
appkey = "APPIDをここに入力"
#===================キーワード作成===================
s = "ここにキーワードを入力"
#空白を置き換え
s_count = s.count(" ")
#print(s_count)
if s_count > 0:
    keywords = s.replace(" ","%20")
else:
    keywords = s
#print(keywords)
#金額指定
price = "100"

URL = "http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME="+appkey+"&RESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&keywords="+keywords+\
        "&outputSelector=value=***&itemFilter(0).name=MinPrice&itemFilter(0).value="+price+\
        "&itemFilter(1).paramName=Currency&itemFilter(1).paramValue=USD&itemFilter(2).paramName=SoldItemsOnly&itemFilter(2).value=true&paginationInput.entriesPerPage=200&paginationInput.pageNumber=1&sortOrder=PricePlusShippingLowest"

def get_page():
    request = requests.get(URL)
    products = request.json()
    print(products)
    print(products["findItemsByKeywordsResponse"][0]['paginationOutput'])
    for pages in (products["findItemsByKeywordsResponse"][0]['paginationOutput']):
        page = pages["totalPages"]
    #print(s)
    total_page = page[0]
    print(total_page)
    sw = open('ebayWatch.csv','w')#新規作成
    for item in (products["findItemsByKeywordsResponse"][0]["searchResult"][0]["item"]):
        itemId = item["itemId"][0]
        title = item["title"][0]
        categoryId = item[ 'primaryCategory'][0]['categoryId'][0]
        galleryURL = item['galleryURL'][0]
        viewItemURL = item['viewItemURL'][0]
        try:
            condition = item['condition'][0]['conditionDisplayName'][0]
        except:
            condition = '--'
        price = item['sellingStatus'][0]["convertedCurrentPrice"][0]['__value__']
        try:
            watchCount =  item['listingInfo'][0]['watchCount'][0]
        except:
            watchCount = '0'

        sw.write('"'+itemId+'","'+categoryId+'","'+title+'","'+galleryURL+'","'+viewItemURL+'","'+condition+'","'+watchCount+'","'+str(price)+'"\n')
    
    pnum = 1
    if int(pnum) < int(total_page):
        pnum += 1
        for i in range(pnum,int(total_page)):
            url = "http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME="+appkey+"&RESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&keywords="+keywords+\
                    "&outputSelector=value=***&itemFilter(0).name=MinPrice&itemFilter(0).value="+price+\
                    "&itemFilter(1).paramName=Currency&itemFilter(1).paramValue=USD&itemFilter(2).paramName=SoldItemsOnly&itemFilter(2).value=true&paginationInput.entriesPerPage=200&paginationInput.pageNumber=" + str(pnum) + "&sortOrder=PricePlusShippingLowest"
            print(url)
            request = requests.get(url)
            products = request.json()
            print(products)
            for item in (products["findItemsByKeywordsResponse"][0]["searchResult"][0]["item"]):
                itemId = item["itemId"][0]
                title = item["title"][0]
                categoryId = item[ 'primaryCategory'][0]['categoryId'][0]
                galleryURL = item['galleryURL'][0]
                viewItemURL = item['viewItemURL'][0]
                try:
                    condition = item['condition'][0]['conditionDisplayName'][0]
                except:
                    condition = '--'
                price = item['sellingStatus'][0]["convertedCurrentPrice"][0]['__value__']
                try:
                    watchCount =  item['listingInfo'][0]['watchCount'][0]
                except:
                    watchCount = '0'

                sw.write('"'+itemId+'","'+categoryId+'","'+title+'","'+galleryURL+'","'+viewItemURL+'","'+condition+'","'+watchCount+'","'+str(price)+'"\n')
        pnum += 1
    else:
        sw.close()

    sw.close()

if __name__ == "__main__":
    get_page()

ebay APPID

ebayのAPIを使用してキーワード検索をしているため、APPIDはご自身のアカウントに紐づいたものを準備する必要があります。

今回は、こちらの内容を掘り下げることはしません。

また余裕ができればご紹介することもあるかもしれませんが、ググれば出てきますので申し訳ないです。。。

解説

簡単にコードの紹介をします。

自分でコードをいじって欲しい情報を抜いてくるならある程度コードを理解する必要がありますので、よければご覧ください。

モジュール

解説

  1. モジュールのアップデートとダウンロード
  2. モジュールのインポート

①はGCにないモジュールを今回のプロジェクトにダウンロードしています。

このモジュールのダウンロードはランタイムに接続してコードを実行する際に1度だけする必要があります。

プログラムを実行せずに放置するとランタイムを未接続されてしまいます。

そういった場合はもう1度ランタイムに接続してモジュールのダウンロードとアップデートをしましょう。

ランタイムに接続して1度モジュールのインストールが終わったらコメントアウトしてOKです。

モジュールのインストールは割と時間がかかります。(数分)

コメントアウトとは

コメントアウトとはコードの実行をする際にプログラムにコメントアウトしている部分を実行させない処理です。

その方法は2つです。

1行もしくは任意の箇所以降のみコメントアウトする場合は、コメントアウトしたい文字の先頭に「#」を入力します。

まとまった行をコメントアウトする場合は該当の範囲の頭とお尻にダブルクォテーションを3つ連続で入力します。

コメントアウト後の文字色は違いますがやっていることは同じ

②は①でインストールしたモジュールを今回のプロジェクトにインポートしています。

こちらは毎度やる必要があるのでいじらないようにしましょう!

検索条件の設定

解説

  1. ebayのAPPIDを入力します
  2. 検索したいキーワード入力
  3. 検索したい最低金額を入力

③はそのままコピペしてください。

④は複数のキーワードで検索する場合は半角英数字のスペースを入力します。

また、このプログラムは検索結果のページ数が多すぎるとうまくダウンロードできません。(数百ページ程度で不具合)

キーワードを使って欲しい情報をうまく抽出できるようにしましょう!

⑤検索結果の最低金額をドルで入力します

APIの呼び出しとデータ入手

解説

  1. ebayのAPP用にURLを作成
  2. API呼び出し後返ってきたデータをリストに格納してCSVに書き出し

⑥はAPIで呼び出せるようにURLを作成します。

URLの前半はAPIで呼び出してする命令内容みたいなものです。

後半は呼び出して返ってきたデータをソートしています。

⑦はrequestでURLの内容を呼び出しています。

その後、返ってきた内容をJson方式で受け取ています。

    for pages in (products["findItemsByKeywordsResponse"][0]['paginationOutput']):
        page = pages["totalPages"]

このforは返ってきたデータから検索結果が合計で何ページあるのかを調べています。

sw = open('ebayWatch.csv','w')#新規作成

CSVデータを作成

データ名は「ebayWatch.csv」となり、「w」はプログラムを実行するたびに内容を上書きする。という意味です。

for item in (products["findItemsByKeywordsResponse"][0]["searchResult"][0]["item"]):
        itemId = item["itemId"][0]
        title = item["title"][0]
        categoryId = item[ 'primaryCategory'][0]['categoryId'][0]
        galleryURL = item['galleryURL'][0]
        viewItemURL = item['viewItemURL'][0]
        try:
            condition = item['condition'][0]['conditionDisplayName'][0]
        except:
            condition = '--'
        price = item['sellingStatus'][0]["convertedCurrentPrice"][0]['__value__']
        try:
            watchCount =  item['listingInfo'][0]['watchCount'][0]
        except:
            watchCount = '0'

このforは、jsonの内容からitemid、title、categoryid、画像URL、商品ページURL、condition、price、ウォッチ数を整理してリストに格納します。

sw.write('"'+itemId+'","'+categoryId+'","'+title+'","'+galleryURL+'","'+viewItemURL+'","'+condition+'","'+watchCount+'","'+str(price)+'"\n')

整理したリストから1つずつCSVデータに書出しを行います。

複数ページがある場合

解説

  1. もし、検索結果が複数ページに至る場合は次のページの内容を取得します
    pnum = 1
    if int(pnum) < int(total_page):
        pnum += 1
        for i in range(pnum,int(total_page)):

このifとforはもし、最初に調べたトータルページ数が1以上なら2ページ目を検索して3ページもあれば繰り返すという内容です。

最後に CSVをcloseして終了!

動作結果

プログラムを走らせるとこのようになります。

ヘッダーとかないのですが、左からアイテムID,カテゴリ番号、タイトル、画像URL、ページURL、コンディション、ウォッチ数、価格です。

あとは少ないウォッチ数の商品を削除して外注さんにリサーチをお願いすれば、効率よくリサーチの自動化が可能です。

ちなみに画像URLを一緒にDLしているのは、自分が整理するときにどんな商品だったのか見た目でも判断できるようにするためです。

僕はスプレッドシートで整理するときに画像のように写真を表示しています。

まとめ

いかがでしたか?

何も知識がない状態から作成したebay apiなのでコーディング内容も、もしかすると見にくい部分があるかもわかりません。

しかし!大事なのは動くこと!そして求める内容を得られることです!

今後もpythonでebayを仕組み化するための奮闘記とコードを公開していくつもりなので僕の知識がお役に立てると幸いです。

Posted by ゆき