Help us understand the problem. What is going on with this article?

ヤフオク(Yahoo!オークション)のページをWebスクレイピングするのに必要な情報をまとめた(最終更新日:2015.3.13)

More than 5 years have passed since last update.

はじめに

Yahoo!オークションの商品の落札価格の予測をしようと思い、過去の落札商品の値段のデータを数百件分取得する必要があった。この為の手法としてWeb APIを使う方法や、Webスクレイピングと言うWebページの特定の部分を削り出す方法がある。そこでYahoo!オークションのページをWebスクレイピングするのに情報をまとめてみた。

準備するべき環境

  • LAMP環境やXAMPPなどPHPが実行できるもの
  • PHP Simple HTML DOM Parser(ソースコードはこちら)
  • Ruby,Pythonなどの言語でWebスクレイピングのできる環境が整っている

ヤフオクページの検索クエリの内訳

まずヤフオクのサイト(http://closedsearch.auctions.yahoo.co.jp/closedsearch?select=XX&ei=UTF-8&va=XX)の?マーク以後に様々なクエリが出て来るので、このクエリが何を示すかについて調べた。万一間違っている箇所があったら、是非とも報告して欲しい。

クエリ名 内訳
va 検索ワード
ei 文字コード(utf-8など)
slider 左の検索条件。1から順に、「検索条件」「落札価格」「商品の状態」「出品者」
n 検索件数(20,50,100の順)
b n*(現在のページ数)+1の値 要は各ページの開始位置(件目)
o1 aが昇順(order by asc)、dが降順(order by desc)
s1 cが落札価格が選択されている状態、bidsが入札状況、endが終了日時
select 別表参照

クエリselectにおけるクエリパラメーターについて

パラメーターの値 内訳 パラメーターの値 内訳
24 開始価格が安い順 03 入札の多い順
25 開始価格が高い順 04 入札の少ない順
01 落札価格の安い順 05 終了日時の遠い順
02 落札価格の高い順 06 終了日時が近い順

落札価格等に対応するhtmlクラスの場所

次に落札価格のみ切り取りたいと言った場合に必要なのが、「落札価格のテキストは、htmlのどのクラスのテキストか?」と言う情報である。これをまとめたのが下の表になる。

こういう特定のクラスを探すにあたりfirefoxのfirebugなどを使って、クラスを特定していくとやりやすい。例えば落札価格の情報が知りたければ「.ePrice」クラスに着目すれば良いことが分かる。

内訳 htmlのクラス/タグ名(1階層目) htmlのクラス/タグ名(2階層目) htmlのクラス/タグ名(3階層目)
商品名 a1 h3 a
落札価格 pr2 ePrice
開始価格 pr2 sPrice
入札 bi a
終了日時(日付) pr2 d
終了日時(時間) pr2 t

サンプルPHPソースコード

次は各項目をPHPでスクレイピングするのに、どう設定すれば良いのかをまとめたソースコードを紹介する。

ヤフオク全体を見て、例えば終了時間の「.t」など別の場所でクラス指定されている場合もあり、親クラスと言うべき「.pr2」から場所指定をした方が確実にスクレイピングしやすい。この辺を見極められるかが肝心な場合も多い。

ソースコード(2015.3.13に追記)

yahoo_auction_scrape.php
<?php
require_once("simple_html_dom.php");

$yahoo_url="http://closedsearch.auctions.yahoo.co.jp/closedsearch?va=3DS&ei=UTF-8&b=1";

$html = file_get_html($yahoo_url);

/*商品名を読む場合(2015.3.13に追記)*/
$a1_h3_a =  $html->find('.a1',0)->find('h3',0)->find('a',0)->plaintext;

/*落札価格と開始価格を読む場合*/
/*クラス「.pr2」の偶数(2N)番目に落札価格が格納*/
$pr2_Price =$html->find(".pr2",0);//終了日時を指し示すクラス
$ePrice = $pr2_Price->find(".ePrice",0)->plaintext;//落札価格
$sPrice = $pr2_Price->find(".sPrice",0)->plaintext;//開始価格

$bi_a = $html->find(".bi",0)->find("a",0)->plaintext;//入札件数

/*終了日時を読む場合*/
/*クラス「.pr2」の奇数(2N+1)番目に終了日時が格納*/
$pr2_endtime =$html->find(".pr2",1);//終了日時を指し示すクラス
$d = $pr2_endtime->find(".d",0)->plaintext;//終了日時(日付)
$t = $pr2_endtime->find(".t",0)->plaintext;//終了時間(時間)

//テスト用に表示するプログラム
print "商品名: ".$a1_h3_a."<br>";
print "落札価格: ".$ePrice."<br>";
print "開始価格: ".$sPrice."<br>";
print "入札件数: ".$bi_a."<br>";
print "終了日時(日付): ".$d."<br>";
print "終了日時(時間): ".$t."<br>";
exit;//念のためここで終了
?>

実行結果(2015.3.13に差し替え)

scrape_image.png

最後に

今日の記事ではヤフオク!のページをWebスクレイピングするのに必要な情報をまとめてみた。次回は実際に抜き取った情報をどう活用するかについて触れたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした