自分流

なんちゃってエンジニアによる自分用メモ

プログラム

PHPでAmazonの中古価格を半自動取得(スクレイピング)

投稿日:

実家にある大量のゲームソフトを処分することになったかじです。

 

正確に数えてませんが総数500本越えなんですけど、色々考えた結果メルカリに出すことにしました。

で、その500本のソフトの中古価格を知りたく、手っ取り早くAmazonで中古価格調べようと思ったけど。。。

といったところで、以下のようなものを作ってみました。

 

アマゾン中古価格取得ツール

仕様

アマゾンの商品URLを受け取って以下を取得する

  • 商品名
  • 中古登録件数(10件までのみ考慮)
  • 中古価格:最安値
  • 中古価格:3件の平均
  • 中古価格:5件の平均
  • 中古価格:10件の平均

 

アマゾンの商品URLはアマゾンで検索して詳細画面を自分で出す必要がありますが、URLを指定すると自動的に中古価格を参考程度に取得するものです。

 

画面イメージ

最安値より平均の方が安いのは、送料を考慮していないからです。まぁ参考価格の雰囲気がわかればいいかなって用途なので放置しています。

 

スクレイピングって?

スクレイピングって聞いたことありますか?

ざっくり言えば、Webの情報をプログラムでうまいこととってくる技です。

 

今回のアマゾンの中古価格も全部ブラウザで取得できる公開されているデータですが、全部手動でやるとしんどいので、一部プログラムで自動化しているわけですね。

やりすぎるとサーバーに負荷をかける攻撃とみなされたりするので、実装する際は慎重にしましょう。

 

というわけでスクレイピングで実装していますが、スクレイピングは以下を参考にさせてもらいました。

phpでウェブスクレイピング

 

 

phpQuery

本来、HTMLの解析などの機能を実装する必要があるのですが、便利なライブラリとして公開してくれている方がいたので使わせてもらいます。

phpQuery公式サイト

導入は簡単で、ダウンロードしてrequireするだけです。

使い方も簡単だし、参考サイトに詳しく載っているので割愛!

 

 

実装

 

大きく分けて2つの機能があります。

①B番号取得

②中古価格取得

 

B番号取得

 

アマゾンの商品ページのURLは

https://www.amazon.co.jp/%E3%82%B9%E3%82%AF%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%BB%E3%82%A8%E3%83%8B%E3%83%83%E3%82%AF%E3%82%B9-15783641-%E3%83%A9%E3%82%B9%E3%83%88-%E3%83%AC%E3%83%A0%E3%83%8A%E3%83%B3%E3%83%88-Xbox360/dp/B000QHSHC0/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=xbox360+%E3%83%A9%E3%82%B9%E3%83%88%E3%83%AC%E3%83%A0%E3%83%8A%E3%83%B3%E3%83%88&qid=1572832258&sr=8-3

このようになっていて見た感じ

https://www.amazon.co.jp/hogehoge/dp/Bから始まるID/hogehoge

という作りになっています。

商品を特定する上でBから始まるID(B番号と勝手に呼称)さえあれば十分なのでB番号をまず取得します。

これも相当強引ですが、urlを/で分割して、”dp”のあとにB番号がくるものとしてB番号を取得しています。

続く中古価格取得ロジックに処理を渡しています。

 

 

中古価格取得

スクレイピングは取りたいデータがあるページのソースとにらめっこになります。

僕もアマゾン中古ページのソースとにらめっこしました。

 

そこで分かったのが

  • h1タグに商品名が入る
  • olpOfferPriceというIDに順番に中古価格が入る

ターゲットが明確になったら試行錯誤しながらとっていきます。

アマゾンの中古のページは

https://www.amazon.co.jp/gp/offer-listing/B番号/ref=dp_olp_used?ie=UTF8&condition=used

このURLで統一されていたので、①で取得したB番号で上記URLにアクセスします。

URLが定ったらphpQueryを使って解析しながら欲しいデータを取得します。

 

これで$titleに<h1>タグの内容が入ります。

 

$countにolpOfferPriceの個数が入り

その個数分 $doc[“.olpOfferPrice:eq($i)”]->text() を繰り返すことで順番に中古価格が入ります。

入る中古価格は¥5,800のように、¥と,が入って邪魔なので除去しています。

 

最後に自分が見やすいように整形して終了!

 

 

まとめ

HTMLの分解や組み立てなど、めんどくさい部分はだいたい先人の天才が良い感じのツール作ってくれています。

なので、僕らはその技術を大いに使わせてもらって、コアとなる部分の実装に力を入れましょう。

 

ターゲットとなるページのHTMLを見て、欲しい情報がどういう構造で配置されているのか、それがわかれば簡単にデータが拾えます。

とはいえ、短期間に大量のアクセスをしてしまうと攻撃になってしまうので、そこは注意しないといけませんし、WebAPIがすでに用意されている場合はそれを使わないといけない。というケースも存在します。

 

せっかくプログラムわかるんなら、こういうところで便利に暮らしたいですね。

 

 

-プログラム


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Ruby on Railsのお勉強【環境構築】

Ruby on Railsのお勉強【環境構築】

勉強おたくな僕は定期的に新しい環境に手を出したくなります。 最近ヒマなので、一部界隈で大人気のRuby on Railsってのも触ってみようかなと。 最終目標はInstagramクローンの作成です。 …

Top