LoginSignup
5
4

More than 3 years have passed since last update.

ebaysdkでキーワード検索した結果をGoogleSpreadSheetsに書き込む

Last updated at Posted at 2021-01-07

はじめに

ebayのAPIを利用するために必要なことは前回の記事をご覧ください。
今回はebaysdkというライブラリを使用してebayに出品されている商品を
キーワード検索で取得した情報をgspreadを使用して
Google Spread Sheetsに書き込むやり方を紹介したいと思います。

下準備

まずはこちらの記事を参考に
Google Spread SheetsにPythonからアクセスするための必要な下準備を済ませてください。

ライブラリのインストール

次に必要なライブラリをインストールしましょう。

pip install ebaysdk gspread oauth2client

参考コード

spread_sheet_keyは記録用に作成したスプレッドシートのURLの
https://docs.google.com/spreadsheets/d/SPREADSHEET_KEY/edit#gid=0
SPREADSHEET_KEYの部分に当たります。

このプログラムを実行するとこのようにスプレッドシートに取得した値が書き込まれます。
gspread.png

ebay_sdk.py
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from ebaysdk.finding import Connection as Finding
from ebaysdk.exception import ConnectionError

appkey = 取得したAPP KEY
keyword = "Marvel Spiderman"  # 検索したいキーワード
jsonf = "~~~~~~~~~.json"  # 下準備で保存したjsonファイル名
spread_sheet_key = "SPREADSHEET_KEY"  # 分からない方は上記を参考にしてください


# Google Spread Sheetsにアクセス
def connect_gspread(jsonf, key):
    scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
    credentials = ServiceAccountCredentials.from_json_keyfile_name(jsonf, scope)
    gc = gspread.authorize(credentials)
    worksheet = gc.open_by_key(key).sheet1
    return worksheet


# ebaysdkで取得した情報をスプレッドシートに書き込み
def write_to_sheet(ws, response_dict):
    ws.update_title(keyword)  # ワークシート名を検索したワードにする
    column = ["商品ID", "商品名", "通貨", "値段"]
    results = response_dict["searchResult"]["item"]

    for item in (results):
        column.append(item["itemId"])
        column.append(item["title"])
        column.append(item["sellingStatus"]["currentPrice"]["_currencyId"])
        column.append(item["sellingStatus"]["currentPrice"]["value"])

    cell_list = ws.range("A1:D" + str(len(results)))  # 検索結果の数だけ範囲指定

    for i, cell in enumerate(cell_list):
        cell.value = column[i]

    ws.update_cells(cell_list)  # リクエストを減らすために一気に更新


try:
    api = Finding(appid=appkey, config_file=None)
    response = api.execute("findItemsAdvanced", {
        "keywords": keyword,
        "itemFilter": [
            {"name": "MinPrice", "value": "50", "paramName": "Currency", "paramValue": "USD"},
            {"name": "MaxPrice", "value": "150", "paramName": "Currency", "paramValue": "USD"}
        ],
        "sortOrder": "CurrentPriceHighest"
    })
    response_dict = response.dict()
    write_to_sheet(connect_gspread(jsonf, spread_sheet_key), response_dict)
except ConnectionError as e:
    print(e)
    print(e.response.dict())

まず初めに、以下のコードでebayのapiにアクセスしていて
キーワードでの検索結果をresponseに格納している
itemFilterでは最低価格と最高価格を指定しているが、他にも商品の状態(新品や中古)で絞ることもできる。

try:
    api = Finding(appid=appkey, config_file=None)
    response = api.execute("findItemsAdvanced", {
        "keywords": keyword,
        "itemFilter": [
            {"name": "MinPrice", "value": "50", "paramName": "Currency", "paramValue": "USD"},
            {"name": "MaxPrice", "value": "150", "paramName": "Currency", "paramValue": "USD"}
        ],
        "sortOrder": "CurrentPriceHighest"
    })

次に、connect_gspread(jsonf, spread_sheet_key)でスプレッドシートにアクセスしていて
取得したワークシートの情報とレスポンスを辞書化したものをwrite_to_sheetの引数に渡しています。

response_dict = response.dict()
write_to_sheet(connect_gspread(jsonf, spread_sheet_key), response_dict)

ワークシートの1行目は何の列なのかを分かりやすくする為にカラム名を入れたいので

column = ["商品ID",  "商品名", "通貨", "値段"]

としています。
次に、商品の検索結果だけが欲しいので

results = response_dict["searchResult"]["item"]

で、検索結果の商品情報をresultsに格納して、検索でヒットした数の分の商品情報を
columnに順番に追加するようにしています。

for item in (results):
    column.append(item["itemId"])  # 商品ID
    column.append(item["title"])   # 商品名
    column.append(item["sellingStatus"]["currentPrice"]["_currencyId"])  # 通貨
    column.append(item["sellingStatus"]["currentPrice"]["value"])        # 値段

各自で欲しい情報をcolumnに追加していってください。
この際に気をつけなければならないことがあります。
今回は["商品ID", "商品名", "通貨", "値段"]の順番なので、
この順番通りに各商品の情報をcolumnに追加していかなければなりません。
gspread.png

理由としては、update_acellupdate_cellで一つずつ更新することもできるのですが
これだと検索結果が多かった場合にリクエストが多くなってしまい
APIのリクエスト制限に引っかかってしまいます。

なので大量のデータを一気に更新できるように、update_cellsを使います。
このupdate_cellsの引数は一次元配列じゃないといけないので、順番に入れるようにしています。

cell_list = ws.range("A1:D" + str(len(results)))

for i, cell in enumerate(cell_list):
    cell.value = column[i]

ws.update_cells(cell_list)

ws.range("A1:D" + str(len(results)))としているのは
例えば検索結果が3商品ヒットの場合
1行目はカラム名A1(商品ID)、B1(商品名)...
2行目から検索結果となりますよねA2(検索結果1の商品ID)、B2(検索結果1の商品名)...
そして3商品ヒットなので最後はD4(検索結果3の値段)となるようにしたいので
検索結果毎に動的に設定できるように"A1:D" + str(len(results))としてあります。

ws.range()は、ワークシート内の選択した範囲内のセルの情報が取得されます。

なので取得したセルの情報をcell_listに格納して

for i, cell in enumerate(cell_list):
    cell.value = column[i]

columnに入っている商品情報をcell_listの各セルに書き込んでいきます。

ws.update_cells(cell_list)

あとはupdate_cellsで編集したcell_listを引数で渡せば、一気に更新できます。

今回は、とりあえず動くように作りましたが
他に分かりやすく簡潔にできる方法などあれば教えて頂けると幸いです。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4