Pythonでメルカリの売り切れの商品情報をスクレイピングで集めてみた

一部プロモーションを含みます

メルカリ商品情報スクレイピング
この記事で解決できる内容

※タップすると該当箇所までジャンプできます。

ペペまるプロフィール

今回はメルカリで売り切れになっている商品情報だけをスクレイピングして、CSVファイルに出力するプログラムを作成してみました。

今回は「商品名」「商品説明」「販売価格」「商品画像」「商品ページURL」の5つを100件程取得してくるコードになっていますが、この記事を読んでいただければ十分にアレンジも可能かと思います。

「Pythonでスクレイピングできることを増やしたい」「メルカリでスクレイピングは禁止されているけど大丈夫?」と疑問に感じている人はぜひ最後まで読んでみてください!

ペペまる

スクレイピングは便利なので是非身に付けていきましょう!!

スクレイピングを身に付けるなら

開発の人気オンラインコース
  • 最大95%OFFで有料コンテンツが購入可能!
  • ITスキルを本よりもわかりやすく体系的に学べる!
  • スキマ時間で学習が可能!

Udemy 公式サイトはこちら

>> ぺぺまるがプログラミングスキルを身に付けるまでにやってきたことまとめ

メルカリで売れている商品情報をスクレイピング!コードの全貌

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import chromedriver_binary
import time
import pandas as pd

item_ls = []
item_url_ls=[]

#ブラウザの設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

#ブラウザの起動
browser = webdriver.Chrome('chromedriver',options=options)
browser.implicitly_wait(3)

#キーワード設定
KEYWORD = '白Tシャツ メンズ'

def get_url():
    #売り切れ表示
    url = 'https://jp.mercari.com/search?keyword=' + KEYWORD + '&status=sold_out%7Ctrading'
    browser.get(url)
    browser.implicitly_wait(5)

    #商品の詳細ページのURLを取得する
    item_box = browser.find_elements_by_css_selector('#item-grid > ul > li')
    for item_elem in item_box:
        item_url_ls.append(item_elem.find_element_by_css_selector('a').get_attribute('href'))

def get_data():
    #商品情報の詳細を取得する
    for item_url in item_url_ls:
        browser.get(item_url)
        time.sleep(3)
        #商品名 
        item_name = browser.find_element(By.CSS_SELECTOR,'#item-info > section:nth-child(1) > div.mer-spacing-b-12 > mer-heading').text
        shadow_root = browser.find_element(By.CSS_SELECTOR,'#item-info > section:nth-child(2) > mer-show-more').shadow_root
        item_ex = shadow_root.find_element(By.CSS_SELECTOR,'div.content.clamp').text
        src_shadow = browser.find_element(By.CSS_SELECTOR,'#main > article > div.layout__LayoutCol-sc-1lyi7xi-2.jNCCiQ > section > div > div > div > div > div.layout__LayoutCol-sc-1lyi7xi-2.cHKFjh > div > div > div > div > div.slick-slide.slick-active.slick-current > div > div > mer-item-thumbnail').shadow_root
        src = src_shadow.find_element(By.CSS_SELECTOR,'div > figure > div.image-container > picture > img').get_attribute('src')
        shadow_root1 = browser.find_element_by_css_selector('#item-grid > ul > li:nth-child(1) > a > mer-item-thumbnail').shadow_root
        price_shadow = shadow_root1.find_element(By.CSS_SELECTOR,'div > figure > div.price-container > mer-price').shadow_root
        item_price = price_shadow.find_element(By.CSS_SELECTOR,'span.number').text
        
        data = {
            '商品名':item_name,
            '商品説明':item_ex,
            '価格':item_price,
            'URL':item_url,
            '画像URL':src
        }

        item_ls.append(data)


def main():
    get_url()
    get_data()
    pd.DataFrame(item_ls).to_csv('メルカリデータ.csv')


if __name__ == '__main__':
    main()

上記コードをコピペして実行してしばらく待ってあげると「メルカリデータ.csv」というCSVファイルが作成されます。スプレッドシートやExcelで読み込んであげると、以下のように、商品情報が取得されます。

以下では、どんなコードになっているのかを、解説していきますので、学習のお供にも使ってみてください。

メルカリ売れている商品情報取得コード解説

今回、実行を確認できている開発環境は以下です。

  • macOS Monterey 12.4
  • Python 3.9.7
  • VSCode

まず今回のコードで行ったスクレイピングの流れ(アルゴリズム)は以下の用な感じ。

  • 必要ライブラリのインポート
  • ブラウザの設定
  • ブラウザ起動
  • 指定キーワードで検索した商品情報一覧ページにアクセス
  • 商品情報の詳細が取得できるURLの取得
  • 取得したURLにアクセスして必要情報の取得
  • データをまとめて出力する

こんな流れになっています。

7つの流れに沿って、コードの解説をしていきます。

①必要ライブラリのインポート

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import chromedriver_binary
import time
import pandas as pd

使用したライブラリは主に2つで、「Selenium」と「Pandas」の知識があれば作成できます。便利ですね。

SeleniumとPandasに関しては別記事で解説もしているので良かったらチェックして見てください。

  • Selenium ⇒ ブラウザの自動操作(スクレイピング)に使う
  • Pandas ⇒ 取得した情報をテーブルに格納するのに使う
item_ls = []
item_url_ls=[]

は、後で使うリストを先に作成してあげているだけなので後ほど触れます。

②webdriver.ChromeOptions()でブラウザの設定を行う

#ブラウザの設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

次にブラウザの設定をしていきます。

options = webdriver.ChromeOptions() と定義してあげることで、options.add_argument('設定したいこと')とするだけで設定できるようにしています。

今回設定したのは、3つ。

  • --headless → ヘッドレスモードで起動する
  • --no-sandbox → sandboxモードを解除する
  • --disable-dev-shm-usage → /dev/shmパーティションの使用を禁止する

ヘッドレスモードとは、Pythonファイルを実行時にブラウザをバックグラウンド上で起動してくれるモードです。ヘッドレスモードがないと、実際にブラウザが起動し、自動でメルカリの画面が表示されて、検索して、と画面が動かないので、動作が重くなってしまいます。

sandboxモードとは、本来セキュリティを高めるためのものですが、仮想環境などでPythonファイルを実行したいときなどには、sandboxのせいで正常に動作しないことがあるため、入れています。

/dev/shmパーティションとは、仮想環境を構築できるDockerなどを使った場合、使用するメモリスペースに/dev/shmという場所をつかうのですが、コレがあまりにも小さいメモリのため、メモリ不足で正常に動作してくれないことが多いのです。Dockerなどを使った開発のときには入れておくといいでしょう。

③webdriver.Chrome('chromedriver',options=options)でブラウザの起動

#ブラウザの起動
browser = webdriver.Chrome('chromedriver',options=options)
browser.implicitly_wait(3)

webdriver.Chrome('chromedriver',options=options) でブラウザを起動します。引数に先程設定したoptionsを入れてあげることでヘッドレスモードで起動できています。

browser.implicitly_wait(3)は、要素が見つかるまで最大3秒待つというコードです。同じく、次の処理を待機させるものに、標準ライブラリのtime.sleep()を使ったものがありますが、time.sleep(3)は必ず3秒待機するのに対して、browser.implicitly_wait(3)は要素が見つかりさえすれば、3秒以内で次に移動します。

そのため少し長めに設定していてもいいので便利です。

④browser.get(url)で指定キーワードで検索した商品情報一覧ページにアクセス

#キーワード設定
KEYWORD = '白Tシャツ メンズ'
def get_url():
    #売り切れ表示
    url = 'https://jp.mercari.com/search?keyword=' + KEYWORD + '&status=sold_out%7Ctrading'
    browser.get(url)
    browser.implicitly_wait(5)

seleniumを使えば、メルカリのトップページから、検索ボックスに自分で検索したいワードを入力して、検索ボタンをクリックしてという動作が可能ですが、今回はちょっとずるをした方法を選択しています。

'https://jp.mercari.com/search?keyword=' + KEYWORD + '&status=sold_out%7Ctrading'

とurlを予め、指定してあげることで、keywordに自分の検索したいキーワードを格納してあげるだけで、すでに売り切れの商品だけの情報をメルカリのページで表示できます。

browser.get(url) でページにアクセスします。

ペペまる

メルカリには実際に売り切れだけを表示させるチェックボックスを入れる箇所があって、チェックをつけると上記のようにURLが変化することが確認できます!

⑤browser.find_elements_by_css_selector()で商品情報の詳細が取得できるURLの取得

#商品の詳細ページを確認する
    item_box = browser.find_elements_by_css_selector('#item-grid > ul > li')
    for item_elem in item_box:
        item_url_ls.append(item_elem.find_element_by_css_selector('a').get_attribute('href'))

上のbrowser.get(url)でアクセスしたページは、指定したキーワードで検索した商品一覧のページです。

ここから、商品の詳細ページに遷移して商品名や価格などの情報を取得していくので、まずは、販売済みの商品情報のURLをitem_url_ls に格納してあげています。

⑥取得したURLにアクセスして必要情報の取得

def get_data():
        
    for item_url in item_url_ls:
        browser.get(item_url)
        time.sleep(3)
        #商品名 
        item_name = browser.find_element(By.CSS_SELECTOR,'#item-info > section:nth-child(1) > div.mer-spacing-b-12 > mer-heading').text
        shadow_root = browser.find_element(By.CSS_SELECTOR,'#item-info > section:nth-child(2) > mer-show-more').shadow_root
        item_ex = shadow_root.find_element(By.CSS_SELECTOR,'div.content.clamp').text
        src_shadow = browser.find_element(By.CSS_SELECTOR,'#main > article > div.layout__LayoutCol-sc-1lyi7xi-2.jNCCiQ > section > div > div > div > div > div.layout__LayoutCol-sc-1lyi7xi-2.cHKFjh > div > div > div > div > div.slick-slide.slick-active.slick-current > div > div > mer-item-thumbnail').shadow_root
        src = src_shadow.find_element(By.CSS_SELECTOR,'div > figure > div.image-container > picture > img').get_attribute('src')
        shadow_root1 = browser.find_element_by_css_selector('#item-grid > ul > li:nth-child(1) > a > mer-item-thumbnail').shadow_root
        price_shadow = shadow_root1.find_element(By.CSS_SELECTOR,'div > figure > div.price-container > mer-price').shadow_root
        item_price = price_shadow.find_element(By.CSS_SELECTOR,'span.number').text

        data = {
            '商品名':item_name,
            '商品説明':item_ex,
            '価格':item_price,
            'URL':item_url,
            '画像URL':src
        }

        item_ls.append(data)

それでは一つ一つ商品情報の詳細が確認できるページにアクセスして、情報を取得していきます。

注意点として、#shadow_root 内にある要素のスクレイピングでちょっと手こずったことですね。

メルカリの情報をbrowser.find_element()で取得しようとすると、どうやら#shadow-root内の要素はすんなり取得させてくれないので、一旦、

shadow_root = browser.find_element(By.CSS_SELECTOR,'#item-info > section:nth-child(2) > mer-show-more').shadow_root

でshadow_rootに#shadow-root内の要素をこれから取得しますよ!という内容のコードを設定してあげることで、shadow_root.find_element()で#shadow-root以下の要素も取得できるようになります。

必要な情報を取得できたので、dataという辞書型に入れてあげたものをitem_lsに一商品ごとに格納してあげています。

⑦Pandasでデータをまとめて出力する

def main():
    get_url()
    get_data()
    pd.DataFrame(item_ls).to_csv('メルカリデータ.csv')

def get_url()でurlの取得するところまでを関数化し、get_data()には一つの商品ページから必要情報を取得してリストに格納するところまでを定義しているので、あとは商品情報を格納してあるリストを用いてデータフレームを作成し、CSVに出力する作業です。

Pandas.DataFrame()でDataFrameを作成し、DataFrame.to_csv('保存名')でCSV出力ができます。

それを今回は一行にまとめてpd.DataFrame(item_ls).to_csv('メルカリデータ.csv')としています。

以上がコードの解説です。

メルカリでスクレイピングは禁止されている?

メルカリの利用規約では「スクレイピング禁止!」と明言はされていません。しかし、スクレイピングをすると規約違反になりそうな文面は見受けられます。

例えば以下が禁止されています。

  • 弊社が提供するインターフェイスとは別の手法を用いてサービスにアクセスすること
  • 弊社の事前の書面による許可なく、弊社のサービス外のところで、商業目的で、弊社が提供するあらゆるサービス、コンテンツ、情報、システム、機能、プログラムなどの全部または一部を利用すること
  • 弊社が提供するサービスに繋がっているサーバーやネットワークに対して悪影響を及ぼすこと
  • 弊社がサービスを提供する上で関係するあらゆるシステムに対して、不正にアクセスすること

利用規約はあくまで、法的措置は無いようですが、最悪の場合はメルカリが利用できなくなることも理解したうえでスクレイピングは行ってください!

僕の解釈では、利用規約に同意していない状態、すなわちアカウントでログインをしていない状態であれば、リスクは少ないのではないかと解釈しています。あとは自己責任でお願いします。

Pythonでスクレイピング!おすすめの学習方法はUdemy

Pythonを学習するなら、必ず習得しておきたいスキルの一つが「スクレイピング」です。スクレイピングを学習するときに便利なのが、Udemyという動画学習コンテンツサービス

実際に僕も、本ではなかなか思うようなスクレイピングができなかったところ、Udemyを利用してスクレイピングを学習することでクラウドソーシングで募集されているようなスクレイピングができるようになりました。

特におすすめのUdemy講座は以下の通り。

合わせて読みたい

スクレイピングスキルを身に付けるUdemy講座
本よりお得にスクレイピング習得!おすすめのUdemy講座3選

続きを見る

まとめ

メルカリのスクレイピングは利用規約には違反しています。スクレイピングをする際には自己責任でお願いします。僕はメルカリのリサーチには全くのド素人ですので、この情報があると助かる!

検索条件を少し変更したいなどあれば、ご連絡いただければ改善したコードをお渡しします。Pythonで稼ぎたいなら最初に身につけるべき力はスクレイピングの技術です。

僕は、Udemy講座でスクレイピングの基礎を身に付けて、クラウドソーシングでスクレイピングの案件に応募しまくることで0⇒1を達成しました。

詳しくは以下の記事でまとめて紹介しているので、興味のある方はぜひ読んでみてください!

>> 僕のプログラミングスキルを身に付けるきっかけと実際にやったことまとめ

合わせて読みたい

プログラミングスキルを身につけるきっかけとやったことまとめ
僕のプログラミングスキルを身に付けるきっかけと実際にやったことまとめ

続きを見る

  • この記事を書いた人

ぺぺまる

 \人生を楽しむプロ/

札幌生まれ札幌育ちの26歳|大学受験失敗をきっかけに自分の本当にやりたいことを探求|暗号資産投資で失敗 ▶ 営業代行で自分の商品を作りたくなる ▶ イベント事業 ▶ ブログをはじめました!|アウトプットブログ ▶ 理想の働き方研究室へ|結局人生楽しんだもん勝ちだと思ってます!

-プログラミングスキル
-, ,