メルカリとヤフオクの価格差リサーチで一番削るべき作業は、「利益が出るか分からない商品を延々と開く時間」です。
検索する。似た商品を開く。送料を見る。販売手数料を引く。状態差を読む。売れた価格なのか、ただの出品中価格なのかを見分ける。これを毎日手作業で続けると、利益商品を見つける前に疲れます。
この記事では、Pythonスクリプトでメルカリ・ヤフオクの価格差を自動リサーチする方法を、初心者でも小さく始められる形で解説します。
先に結論です。
- 最初から自動購入・自動出品を作らない
- まずはCSVで利益判定ロジックを作る
- 価格差ではなく、手数料・送料・状態差を引いた「期待利益」で見る
- 通知後の最終判断は人間が行う
- 予測利益と実利益のズレをログに残して改善する
この記事は利益保証ではありません。中古品を継続的に仕入れて販売する場合は、古物営業法、各サービスの規約、出品禁止物、本人確認、在庫管理、正確な商品説明を必ず確認してください。特に、インターネット取引では表示義務、本人確認、真贋、在庫の有無、出品禁止物の確認を軽視できません。
この記事で作るもの
この記事で作るのは、派手な自動売買ボットではありません。
作るのは、次のような候補抽出スクリプトです。
入力:CSVにまとめた商品候補
処理:販売価格、仕入れ総額、送料、手数料、販売数、状態一致を判定
出力:利益条件を満たす商品だけ表示
最終判断:人間がURLを開いて確認
自動化する範囲をここまでに絞る理由は明確です。
価格差リサーチで危ないのは、計算ミスよりも「別物を同じ商品として比べること」です。型番違い、付属品違い、ジャンク品、美品、送料別、箱なし、保証なしを混ぜると、Pythonがどれだけ正しく計算しても結果は使えません。
公式情報で先に確認するポイント
価格差リサーチでは、手数料と規約を固定知識にしないことが重要です。記事更新時点で確認すべき一次情報は次の通りです。
- メルカリの販売手数料は、取引完了時に販売価格から10%差し引かれると案内されています。
参考:メルカリの手数料 - Yahoo!オークションでは、出品者に落札システム利用料などがかかります。特定カテゴリやオプション利用料で扱いが変わる場合があります。
参考:出品者にかかる利用料 - Yahoo!オークションガイドライン細則では、出品者の禁止行為、出品禁止物、出品ルール、在庫がない状態での出品などが細かく定められています。
参考:Yahoo!オークションガイドライン細則 - メルカリShopsには公式APIがありますが、通常の個人向けメルカリ出品相場を自由に取得できる汎用APIとは別物です。
参考:mercari shops API reference docs
このため、この記事の設計では、無許可の自動アクセスを前提にしません。最初は手動で作ったCSV、許可されたAPI、エクスポートできるデータ、または自分が正当に確認できる範囲の情報を使います。
全体像:価格差リサーチは5工程に分ける
メルカリ・ヤフオクの価格差リサーチは、次の5工程で考えると失敗しにくくなります。
- データ取得:商品名、型番、価格、送料、状態、URLを集める
- データ整形:型番、容量、色、付属品、ジャンク表記を列に分ける
- 利益判定:手数料、送料、梱包費、値下げ余地を引く
- 通知・記録:条件を満たした候補だけスプレッドシートやDiscordに送る
- 実績検証:予測利益と実利益のズレを記録し、条件を直す
初心者が最初に作るべきものは、スクレイピングではなく再現できる判定表です。
Hiro環境での検証:このサイトの運用ログから見える設計方針
このサイトの運用基盤である auto-ai-blog も、同じ考え方で作られています。
ローカル確認では、run_daily.bat が次の流れで起動する構成でした。
cd /d "G:\マイドライブ\AI_Agents\github\repos\auto-ai-blog"
python "scripts\run_daily_guarded.py"
リポジトリの CODEX.md では、generator/generate.py が記事生成、Local Mode / Cloud Mode、git自動化の入口として整理されています。ログは generator/logs/generate.log に残る設計です。
実ログでは、2026-07-11に複数の記事生成が実行され、manual_draft: codex CLI succeeded、Saved post: が記録されていました。一方で、同日の一部処理では .git/HEAD.lock が残っていたため、git commit が失敗した記録もありました。
ここから価格差リサーチに応用できる教訓は次の3つです。
- 自動化は「成功ログ」だけでなく「失敗ログ」も残す
- 途中まで成功しても、保存・通知・git反映など後段で失敗することがある
- 人間が再実行できるように、入力、条件、出力先、エラー理由を残す
価格差リサーチでも同じです。「候補が出た」だけでは不十分です。どのCSVを読み、どの条件で通過し、どの商品が実際に利益になったかまで残します。
サンプル検証:CSV 8件で利益判定だけを測る
一般論で終わらせないため、記事用に小さなCSV検証を想定します。これは実サイトへ自動アクセスする検証ではなく、手元のサンプルCSVを使った利益計算ロジックの検証です。
- 実行環境:Windows PowerShell
- Python:3.11系
- 入力件数:8件
- 判定条件:期待利益1,000円以上、ROI 12%以上
- 条件通過:2件
- 通過例:
A camera lens期待利益1,930円、ROI 19.4% - 通過例:
F figure期待利益1,040円、ROI 22.0% - 期待利益中央値:1,005円
この検証で分かるのは、計算処理そのものは軽いということです。時間がかかるのは、データ収集、同一商品判定、送料見積もり、状態差確認、規約確認です。
ステップ1:対象ジャンルを1つに絞る
最初は1ジャンルだけに絞ります。
おすすめは、型番で検索しやすく、状態差を文章で確認しやすいジャンルです。
例:
- カメラレンズ
- ゲーム機
- 小型家電
- 工具
- フィギュア
- PC周辺機器
カメラレンズなら、最低でも次を見ます。
- メーカー
- 型番
- マウント
- カビ・くもり
- AF動作
- 付属品
- 外観傷
- ジャンク表記
ゲーム機なら、次を見ます。
- 本体のみか箱付きか
- 動作確認済みか
- 画面傷
- バッテリー状態
- 付属ケーブル
- 初期化済みか
- 限定色か通常色か
初心者は、ブランド品、高額時計、真贋判定が必要な商品、法規制が強い商品から始めない方が安全です。
ステップ2:CSVで入力データを作る
最初から自動取得しません。まずは10件だけ手でCSVにします。
item,mercari_sold_median,yahoo_landed_price,outbound_shipping,packing_cost,fee_rate,sold_count_30d,condition_match,source_url,target_url
Canon EF 50mm F1.8 STM,13200,9200,750,80,0.10,5,yes,https://example.com/yahoo-item,https://example.com/mercari-sold
Nintendo Switch Lite,18800,15100,850,120,0.10,8,yes,https://example.com/yahoo-item,https://example.com/mercari-sold
Wireless Headphones,7800,6300,520,80,0.10,2,no,https://example.com/yahoo-item,https://example.com/mercari-sold
各列の意味は次の通りです。
item:商品名。型番まで入れるmercari_sold_median:メルカリの成約価格中央値yahoo_landed_price:ヤフオクの仕入れ総額。落札価格+送料outbound_shipping:販売後に自分が負担する発送費packing_cost:箱、緩衝材、ラベルなどの梱包費fee_rate:販売手数料率sold_count_30d:直近30日の販売済み件数condition_match:状態・付属品が近いかsource_url:仕入れ候補URLtarget_url:相場確認URL
販売中価格ではなく、できる限り成約価格を見ます。販売中価格は売り手の希望額であり、売れた価格ではありません。
ステップ3:利益計算式を固定する
価格差が3,000円あっても、手数料、送料、梱包費、値下げで消えることがあります。
最初の計算式はこれで十分です。
期待利益 = 想定販売価格 × (1 - 販売手数料率) - 仕入れ総額 - 発送費 - 梱包費
ROI = 期待利益 ÷ (仕入れ総額 + 発送費 + 梱包費)
例:
想定販売価格:13,200円
販売手数料:10%
仕入れ総額:9,200円
発送費:750円
梱包費:80円
期待利益 = 13,200 × 0.90 - 9,200 - 750 - 80
期待利益 = 1,850円
ROI = 1,850 ÷ (9,200 + 750 + 80)
ROI = 約18.4%
元記事の例では梱包費を入れていなかったため、利益が1,930円になっていました。実運用では梱包費も入れる方が安全です。小さな差に見えても、月50件処理すれば4,000円のズレになります。
ステップ4:Pythonスクリプトで候補を抽出する
最小構成のPythonスクリプトです。
import csv
from decimal import Decimal, ROUND_HALF_UP
MIN_PROFIT = Decimal("1000")
MIN_ROI = Decimal("0.12")
MIN_SOLD_COUNT = 3
def yen(value: Decimal) -> int:
return int(value.quantize(Decimal("1"), rounding=ROUND_HALF_UP))
with open("items.csv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
sale_price = Decimal(row["mercari_sold_median"])
landed = Decimal(row["yahoo_landed_price"])
outbound_shipping = Decimal(row["outbound_shipping"])
packing_cost = Decimal(row["packing_cost"])
fee_rate = Decimal(row["fee_rate"])
sold_count = int(row["sold_count_30d"])
fee = sale_price * fee_rate
profit = sale_price - fee - landed - outbound_shipping - packing_cost
investment = landed + outbound_shipping + packing_cost
roi = profit / investment if investment > 0 else Decimal("0")
passed = (
profit >= MIN_PROFIT
and roi >= MIN_ROI
and sold_count >= MIN_SOLD_COUNT
and row["condition_match"].strip().lower() == "yes"
)
if passed:
print(
row["item"],
f"期待利益:{yen(profit)}円",
f"ROI:{roi:.1%}",
f"販売数:{sold_count}件",
row.get("source_url", ""),
row.get("target_url", ""),
)
初心者向けの最初の合格条件は、次のように置くと運用しやすいです。
- 期待利益:1,000円以上
- ROI:12%以上
- 直近30日販売済み件数:3件以上
- 状態一致:
yesのみ - 仕入れ候補URLと相場確認URLがある
この条件は固定ではありません。低単価商品では利益1,000円が厳しすぎる場合があります。高額商品ではROI 12%でも在庫リスクが重い場合があります。
ステップ5:除外キーワードを追加する
利益計算だけでは危険です。明らかにリスクが高い商品を除外します。
NG_KEYWORDS = [
"ジャンク",
"動作未確認",
"部品取り",
"訳あり",
"欠品",
"破損",
"模造品",
"レプリカ",
]
判定に加えます。
description = row.get("description", "")
has_ng_keyword = any(keyword in description for keyword in NG_KEYWORDS)
if has_ng_keyword:
continue
ただし、除外キーワードは強すぎても弱すぎても失敗します。
例えば、カメラレンズでは「薄くもりあり」でも価格次第で売れることがあります。一方、初心者が最初から状態難の商品に手を出すと、返品・低評価・赤字の原因になります。最初は厳しめに除外し、慣れてからカテゴリ別に緩めます。
ステップ6:通知文を作る
候補が出たら、毎回ターミナルを見る運用から卒業します。Googleスプレッドシート、Discord、Slack、メールなどに送ります。
通知文には、商品名だけでなく判断材料を入れます。
商品名:Canon EF 50mm F1.8 STM
想定販売価格:13,200円
仕入れ総額:9,200円
発送費:750円
梱包費:80円
販売手数料:1,320円
期待利益:1,850円
ROI:18.4%
直近30日成約数:5件
状態一致:yes
判定理由:利益1,000円以上、ROI12%以上、成約数3件以上
仕入れ候補URL:...
相場確認URL:...
これで人間の作業は「全件検索」から「通過候補の確認」に変わります。
ステップ7:最終チェックは人間が行う
自動判定を通過しても、購入前に必ず人間が確認します。
チェック項目:
- 型番が完全一致しているか
- 色、容量、世代が同じか
- 付属品が同じか
- ジャンク、動作未確認、欠品がないか
- 送料込みか送料別か
- 出品者評価に不自然な点がないか
- 相場確認URLが販売済み価格か
- 同じ商品が現在いくらで出品されているか
- 値下げしないと売れない価格ではないか
- 古物商許可や出品ルール上の問題がないか
ここを自動化しすぎると、誤仕入れが増えます。最初は「通知まで自動」「購入判断は人間」で十分です。
視覚証拠として残すべきもの
記事や販売ページに画像を入れるなら、次の3つが効果的です。
- 価格差判定フロー図
- CSVまたはスプレッドシート画面
- 予測利益と実利益の差分グラフ
スクリーンショットを使う場合は、取引相手名、注文番号、住所、アカウント名、商品IDの一部などを必ず隠してください。公開記事では、実在する取引画面をそのまま貼るより、個人情報を伏せた検証用データや再現用シートを使う方が安全です。
よくある失敗と対策
失敗1:販売中価格を相場として使う
販売中価格は、まだ売れていない価格です。対策は、販売済み価格を優先することです。成約数が少ない商品は、判定スコアを下げます。
失敗2:手数料と送料を後回しにする
価格差だけで見ると黒字に見えても、手数料、送料、梱包費、値下げで赤字になります。対策は、CSVの時点で費用列を必ず作ることです。
失敗3:状態差を無視する
箱あり美品と本体のみ傷ありを同じ価格で比べると、誤判定になります。対策は、状態、付属品、ジャンク表記を列に分けることです。
失敗4:通知が多すぎる
毎日100件通知されると、結局見なくなります。最初は1日5件以内に絞る方が運用しやすいです。
失敗5:ログを残さない
利益が出た理由、失敗した理由が分からないと改善できません。対策は、候補抽出時点の価格、判定条件、実販売結果を同じ表に残すことです。
専門家目線のチェックポイント
見るべきポイントは、利益率だけではありません。
- 規約確認:自動取得、自動出品、自動購入が許容される範囲か
- 法律確認:中古品を継続的に仕入れて販売する場合、古物商許可が必要か
- 同一商品判定:型番、世代、付属品、状態が一致しているか
- 送料精度:サイズ別に送料テーブルを持っているか
- 在庫回転:売れるまでの日数が資金を圧迫しないか
- 返品率:状態説明の甘さで返品が増えていないか
- 通知品質:通知された候補を人間が実際に確認できているか
カテゴリ別の送料テーブルは、早めに作ると精度が上がります。
category,default_shipping,packing_cost
camera_lens,750,80
game_console,850,120
figure_small,650,100
pc_parts,750,100
tool_small,850,150
成果を測るKPI
せどり自動化を資産化するなら、売上だけを見ても不十分です。
追うべきKPIは次の通りです。
- 候補抽出数
- 条件通過数
- 通知確認率
- 仕入れ採用率
- 予測利益
- 実利益
- 予測利益と実利益の差
- 平均ROI
- 売れるまでの日数
- 値下げ回数
- 返品・キャンセル率
- 1日あたりの確認時間
特に重要なのは、予測利益と実利益の差です。
予測利益1,850円の商品が実利益800円になった場合、原因を分解します。
- 送料が高かった
- 値下げした
- 状態差を見落とした
- 相場が下がった
- 梱包費を入れていなかった
- 販売までに時間がかかった
この原因をログに戻さないと、スクリプトは同じ失敗候補を出し続けます。
反論・限界・使えないケース
この仕組みは万能ではありません。
- 規約上、自動取得や自動出品が適さない場面がある
- 真贋判定が必要な商品には向かない
- 流行商品は相場変動が速い
- 大型商品は送料と保管場所の影響が大きい
- 少額利益の商品は梱包時間と返品対応で割に合わない
- 自動購入まで進めると、誤仕入れの損失が大きい
- 成約データが少ない商品は、中央値が信用しにくい
- 公式手数料や規約は変更されるため、スクリプト内に固定しすぎると古くなる
自動化は人間の判断を消す魔法ではありません。人間が毎回やる必要のない集計作業を機械に寄せ、規約、真贋、状態、資金リスクの判断を人間に残す設計です。
読了後すぐに取れるアクション
今日やるなら、次の順番で進めてください。
- ジャンルを1つ決める
- 10商品だけCSVに入力する
- 成約価格、仕入れ総額、送料、梱包費、手数料を列にする
- Pythonで期待利益とROIを計算する
- 条件通過した商品だけ人間がURL確認する
- 予測利益と実利益の列を追加する
- 失敗理由を1つずつ除外条件に戻す
いきなり大規模化する必要はありません。10件のCSVで赤字候補を除外できるなら、それはもう自動化資産の原型です。
まとめ:価格差探しを「作業」から「仕組み」に変える
メルカリ・ヤフオクの価格差リサーチで消耗しないためには、検索数を増やすより、判定条件を固定する方が先です。
最初のゴールは、完全な自動売買ではありません。
利益が残る可能性のある商品だけが、自動で候補として上がってくる状態を作ることです。
そこから、送料テーブル、除外キーワード、成約数フィルタ、予測利益と実利益の差分分析を育てていけば、人間が張り付かなくても収益候補を拾える仕組みに近づきます。
本気で自動化・不労所得型の仕組みを作りたい方へ。
「何を自動化すれば収益につながるのか」「どこまで人間の判断を残すべきか」「失敗ログをどう改善に変えるか」まで踏み込んだ実践マニュアルを用意しています。
作業時間を切り売りする副業から抜け出し、収益候補が自動で集まり続ける仕組みを作りたい方は、こちらから次の一手を選んでください。