OFFモールの商品リストを作成する方法 (original) (raw)

利益商品のリサーチ自動化を実現するために、OFFモールから商品の「商品価格」「商品コード」「商品URL」をリスト化する方法です。OFFモールの商品なので基本的には中古品となります。

OFFモールでの商品の検索方法

  1. OFFモールのトップページ(https://netmall.hardoff.co.jp/)にアクセスし、一番上の検索窓は空欄のままで虫眼鏡マークをクリックして検索します。
  2. 右側に検索結果の商品が3列表示されます。また、左側には検索条件を指定するためのメニューが表示されます。
  3. 探したい商品を絞り込むために検索条件を指定します。
    例えば、検索オプションで「プライスダウンのみ表示する」にチェックをすると、値下げされたお得商品のみを探すことができます。また商品ランクでは、中古商品の状態を指定することが出来ます。せどりで転売するつもりであれば、「B:日常使用の中古・傷汚れ少」以上を選択するのが良いです。
  4. 指定した条件に合った商品が検索されます。

プログラミング方法

商品ページへのリンク部分のソースコードは以下のようになっています。複数商品が

で並んでいることが分かります。これは検索条件に「プライスダウンのみ表示する」を指定した時の例です。

一方、検索条件に「プライスダウンのみ表示する」を指定しない場合のソースコードは以下のようになっています。複数商品が

で並んでいることが分かります。プライスダウン品か否かでclass名が異なっています。また、class名の中に不要な空白が含まれているのが分かります。

商品URLの抽出

今回は上記のタグから商品URLを抽出します。商品URLは、商品

の直下にあるタグで指定されています。

for elem in driver.find_elements(By.CSS_SELECTOR, '.itemcolmn_item'):
    item_url = elem.find_element(By.XPATH, 'a').get_attribute('href')

1行目:
seleniumの仕様で、class名に空白を含む場合には「By.CLASS_NAME」や「By.XPATH」では検索が出来ません。空白を含む場合には「By.CSS_SELECTOR」を使う必要があります。"aaa bbb" → ".aaa.bbb"といように、最初に「.(ピリオド)」を付け、空白も「.(ピリオド)」で置き換えます。

"itemcolmn_item itemcolmn_item--pricedown"
"itemcolmn_item "
CSS_SELECTORの指定では上記は2つとも".itemcolmn_item"の指定で検索することが可能です。これで、プライスダウン品か否かによらず、商品ごとのループ処理を共通化することができます。

2行目:

「By.XPATH」を使って相対パス指定で直下にあるタグを検索します。検索結果のタグの「href」属性値を商品URLとして取得します。

商品コードの抽出

上記のタグから商品コードを抽出します。OFFモールのページにはJANコードが記載されていません。中古品なのでJANコードがあるとは限らないためです。商品コードには商品の型番などが記入されていることが多く、メルカリ等で売値を調べる時に、この商品コードを使います。

item_code = elem.find_element(By.CLASS_NAME, 'item-code').text

「By.CLASS_NAME」を指定して、class="item-code"のタグを検索します。検索された

タグのテキストを商品コードとして取得します。

商品価格の抽出

上記のタグから商品価格を抽出します。ここでもclass名に空白が使われています。
item_price = elem.find_element(By.CSS_SELECTOR, '.font-en.item-price-en').text item_price = item_price.replace(',','').replace('円','')

1行目:
class名に空白が使われているので、「By.CSS_SELECTOR」を使って、class="font-en item-price-en"のタグを検索します。検索されたタグのテキスト情報を取得します。

2行目:
取得したテキストは「2,200円」と、区切り文字(カンマ)や「円」が入ったままになっています。数字として扱いやすいように、replace関数を使って「,」や「円」を削除します。

Pythonサンプルプログラム

import os

from selenium import webdriver
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By

# ChromeとChrome Driverのパス設定
base_path = os.path.dirname(__file__)
Chrome = base_path + '/chrome/chrome.exe'  # Chromeのパス
ChromeDriver = base_path + '/chrome/chromedriver.exe'  # Chrome Driverのパス

chrome_service = fs.Service(executable_path=ChromeDriver)
driver = webdriver.Chrome(service=chrome_service)

# OFFモールの検索結果にアクセス
url = "https://netmall.hardoff.co.jp/search/?s=7&pricedown=1&rank=1&rank=2&rank=3&rank=4"
driver.get(url)

# 商品ごとにループ処理
for elem in driver.find_elements(By.CSS_SELECTOR, '.itemcolmn_item'):
    item_url = elem.find_element(By.XPATH, 'a').get_attribute('href')  # 商品URL
    item_code = elem.find_element(By.CLASS_NAME, 'item-code').text  # 商品コード
    item_price = elem.find_element(By.CSS_SELECTOR, '.font-en.item-price-en').text  # 商品価格

    # 商品コードがある場合に、「商品URL」「商品コード」「商品価格」を出力する
    if item_code != '':
        print(f'{item_url}\t{item_code}\t{item_price}')

以下はサンプルプログラムの実行結果です。

サンプルプログラムの動かし方は以下の記事を参考にしてください。