追記:旧PC版のメルカリが完全に利用できなくなったのでこのページに関しては完全に過去のものです。ただ他サイトでのスクレイピングでも同様の方法が使えることも多いので、参考のためにそのまま残しておきます。
新しいバージョンのメルカリでのスクレイピング方法に関しては時間があるときにでも記事にする予定です。
————-追記ここまで—————-
pythonを使って旧PC版のメルカリの商品ページをスクレイピングする方法についてです。
商品データを手動で取得するのはかなりの手間ですから、自動でできるならやってしまいたい。
そういうことはpythonが得意なのでやらせてしまおう!と意気込んでコードを書いたもののうまくスクレイピングできないなんてのはよくあることです。
このページでは管理人が以前に開発したメルカリのスクレイピングプログラムの一部を公開しながら、メルカリでスクレイピングする方法について紹介します。
注意点
注意点1:旧デザイン専用の方法
今回ご紹介するのは旧デザインのPCブラウザ版のメルカリ(www.mercari.com)からのスクレイピング方法です。
新デザイン(jp.mercari.com)はここで紹介する方法ではスクレイピングできませんのでご注意ください。
注意点2:違法にならないように注意
規約違反はともかく、ここでご紹介するのは適法の範囲での方法です。
意識することは1.ログインしなくても見れる範囲だけ、2.メルカリのサーバーに負荷をかけない、の2つです。
違法かどうかについては別ページにて解説していますので先に読まれることをお勧めします。
関連ページ:メルカリのスクレイピングに関する規約と違法性について【python】
コード例(BeautifulSoupオブジェクト取得まで)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import requests from bs4 import BeautifulSoup # ユーザーエージェントを偽装 user_Agent = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"} # 取得する商品ページのurl url = 'https://www.mercari.com/jp/items/mXXXXXXXXXXX/' # getメソッドでresponseオブジェクトを取得 # ヘッダーに偽装したユーザーエージェントを入れる r = requests.get(url, headers = user_Agent, timeout=(6.0,7.5)) # BSオブジェクト化 soup = BeautifulSoup(r.text,'lxml') |
実際に上記のコードをコピペして動かす場合にはメルカリの商品ページのURLを使ってください。
例でやっていることは以下の通りです。
- ユーザーエージェントの偽装
- requests.getメソッドでページデータをresponseオブジェクトとして抜き出す
- responseオブジェクトを扱いやすいBSオブジェクトに変換する
おそらくスクレイピングをしてみようと思って実際にやってみたらエラーが出て進まないという人は、1のユーザーエージェントの偽装を忘れているのだと思います。
メルカリではブラウザ以外からのアクセスを遮断するようになっています。なので馬鹿正直にpythonから直接アクセスすると以下のようになります。
python「pythonからのアクセスです」
メルカリ「ふざけるな、帰れ」
なのでユーザーエージェントと呼ばれる身分証みたいな部分を偽装して、ブラウザのふりをしながらpythonからアクセスするわけです。コード例ではグーグルクロムからのアクセスっぽくしてあります。
python「Google Chromeから来ました」
メルカリ「(ユーザーエージェントもChromeって書いてあるな)」
メルカリ「通って良し」
BSオブジェクトの中身はほぼhtmlの記述そのままなので、ここまで変換できればあとは欲しい情報をgetやselectを使って抜き出すだけです。
例えばsoup.select(‘td’)とすれば商品情報を抜き出すことができますし、soup.select(‘img.owl-lazy’)とすれば画像のurlを取得することもできます。
コード例2(BSオブジェクトから画像urlの取得)
1 2 3 4 5 6 7 8 9 |
# selectメソッドで画像urlの入っているタグの部分を取得 img_list = soup.select('img.owl-lazy') # 取得された画像の1番目からurlを取得 img_url = img_list[0].get('data-src') # テストがてら表示してみる print(img_list) print('url : ' + str(img_url)) |
soupを表示して見てみると、商品画像のhtmlタグにはowl-lazyクラスが指定されていることがわかります。
なのでselectメソッドを使ってその部分をリストとして抜き出します。
抜き出したリストの1番目からURLだけを抜き出すため、リストの1番目(img_list[0])を指定して、URLが入っているdata-srcを抜き出します。
何を言っているのかよくわからない場合でも、細かい理解はとりあえず置いといて、コードをコピペしていろいろ変えてみながら使ってみてください。
いじってれば何となく分かってきます。
商品情報や出品者データなども同じようにしていけば抜き出すことができます。
まとめ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import requests from bs4 import BeautifulSoup # ユーザーエージェントを偽装 user_Agent = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"} # 取得する商品ページのurl url = 'https://www.mercari.com/jp/items/mXXXXXXXXXXX/' # getメソッドでresponseオブジェクトを取得 # ヘッダーに偽装したユーザーエージェントを入れる r = requests.get(url, headers = user_Agent, timeout=(6.0,7.5)) # BSオブジェクト化 soup = BeautifulSoup(r.text,'lxml') # selectメソッドで画像urlの入っているタグの部分を取得 img_list = soup.select('img.owl-lazy') # 取得された画像の1番目からurlを取得 img_url = img_list[0].get('data-src') # テストがてら表示してみる print(img_list) print('url : ' + str(img_url)) |
ちなみにスクレイピングは設定を間違えるとメルカリからアクセス禁止にされる危険と隣り合わせなので、自分のPCじゃなくて仮想デスクトップをレンタルしてそこからそこからスクレイピングする方がオススメです。
それならもし永久アク禁にされても仮想デスクトップをレンタルしなおすだけでまたアクセスすることができます。
詳しくは別ページで解説していますのでそちらを参照してください。