サイトから情報を取得するのにはXPathが便利です。
副業サイトではデータ収集や、サイト情報のスクレイピングなどが多くあるので、
これを覚えておくととても役立ちます。
XPathとは
サイトはHTMLで書かれています。
ブラウザがHTMLを読み取って、文字の大きさや色などの装飾を表現したり、
画像ファイルを参照して表示したりします。
ボタンやリンク、文字などをHTMLから検索するための記法ということになります。
何に使う?
HTMLからボタンなどを検索することで、そのボタンを操作したり、
文章を抜き出したりすることができます。
たとえば、グルメサイトから店舗情報ページに移動し、住所や口コミなどを取得する、
といった自動処理に利用できます。
同じ体裁で書かれているページを大量に処理する場合に便利です。
XPathを試す
プログラムを書かなくても、XPathの威力を簡単に確かめることができます。
Google Chromeで任意のサイトを開き、「F12」を押す。(グルメサイトの店舗一覧ページなど)
開発者向けツールが開きます。
「Elements」タブをクリックすると、HTMLの中身が表示されます。
「Ctrl+F」で検索ボックスが開きます。
検索ボックスに「//div」と入力してみてください。
何かしらヒットしたと思います。これは、「div」タグの要素がすべて検索できた、ということになります。
「div」タグ内に「class」のある要素を見つけてください。
検索ボックスの中身を「//div[@class='<クラス名>'」に変更します。
クラス名が一致する「div」要素のみが一致したと思います。
どうでしょうか。とても簡単に要素を見つけることができたと思います。
FindElementByClassNameと同じですが、XPathのほうが柔軟性があります。
FindElementだと取得した要素の子を探すためにループしたりとコードが長くなる場合が多いですが、
XPathなら必要な要素を狙い撃ちできます。
属性で取得する
タグ内に書かれている「class」「name」「id」「value」などを属性といいます。
これらは「@」指定で一致させることができます。
//div[@class='xxxxx']
//div[@name='xxxxx']
//div[@id='xxxxx']
//div[@value='xxxxx']
サイトによってはオリジナルの属性がある場合もありますが、それも同様に指定できます。
//div[@data-name-area='xxxxx']
テキストで取得する
タグに囲まれている内容を指定して取得することができます。
個人的には、ページ移動リンクを取得することが多いです。
<a href="xxxx">次へ</a>
を取得する場合は以下のように書きます。
//a[text()='次へ']
親を取得する
「parent::<タグ名>」で、指定したタグの親タグを取得できます。
親タグに特徴がない場合に、内部で特定して親にさかのぼる、という使い方をします。
<div>
<span id='xxxx'>aaaaa</span>
</div>
//span[@id='xxxx']/parent::div
となりのタグを取得する
「following-sibling::<タグ名>」で、指定したタグ以降にある隣接タグを取得できます。
「preceding-sibling::<タグ名>」で、手前のタグを取得できますが、
個人的にはこちらはあまり使いません。
<table>
<tr>
<th>住所</td>
<td>●●件●●市●●町</td>
</tr>
</table>
//th[text()='住所']/following-sibling::td
複数ヒットする場合は、インデックスを指定することで特定できます。
//th[text()='住所']/following-sibling::td[1]
インデックスは配列等と異なり、「1」から始まることに注意が必要です。
あいまいな検索
「contains」で、指定文字列を含む条件で検索できます。
表記ゆれのあるサイトで活躍します。
<tr>
<th>電話番号</th>
<td>xxx-xxxx-xxxx</td>
</tr>
//th[contains(text(), '電話')]
and, or, not
複数の条件を組み合わせることができます。
・「and」 2つの条件を両方とも満たす要素のみ。
//div[text()='xxxx' and @class='yyyy']
・「or」 2つの条件のどちらかを満たせばOK
//th[contains(text(), '電話') or contains(text(), 'TEL')]
・「not」 一致するものを除く
//div[not(@class='xxxx')]
まとめ
これまで100サイト以上のスクレイピングを行ってきましたが、
ここに書いてある内容だけで、必要なことはすべてできました。
and, or, notもほとんど使うことはありません。
簡単に覚えられるので、ぜひマスターしてみてください。
副業の入り口としてもデータ収集は手を付けやすいので、
以下のサイトで探してみるのも良いかもしれません。
ちょっとした手間で数千円~報酬になりますよ!
Comentarios