PHP

【PHP】Excite翻訳をスクレイピングしてみた

PHP-アイキャッチ

お断り:本記事は、個人個人のIT技術向上のために使われることを想定して記事にまとめています。スクレイピングでは対象サーバに高い負荷をかける可能性を秘めているため、個人利用・商用利用問わず用法を守って正しくご利用ください。

こんにちは!ゆーたろうです。

今回はエキサイト翻訳のサイトをスクレイピングして、PHPから自動翻訳をするプログラムを組んでみたいと思います。

今回はスクレイピングの例として、エキサイト翻訳を使って解説していきます。

他のサイトをスクレイピングする際も同様の手順・考え方で行えば、どんな情報も取ってくることができるので、ぜひこの記事でスクレイピング手法を学んでみてください。

実際、スクレイピングを主要事業としている企業があったり、クラウドワークスなどの依頼でも多かったりするので、スクレイピング技術の需要はかなりあります。

スクレイピングするソースコードを確認する

まず初めに、スクレイピング対象のサイト構成がどうなっているかを確認する必要があります。

ここで確認する項目は以下のような情報です。

  • 情報取得方法は、POSTなのかGETなのか?
  • 情報の置き場所のURLはどこか?
  • どんな情報を送信しているのか?

を中心に確認します。

そのためには、スクレイピング対象のページへ行き、「右クリック」>「ページのソースを表示」を見ます。

ソースを表示

すると以下のようになります。

エキサイト翻訳のソース

次に、目的の要素がどこにあるかを調べる

※「要素」とは<title>や<form>といった、HTMLを構成するパーツのことです。

まず、下記の画像をご覧ください。

今回の目的は「自動で英語を日本語に変換する」です。

なので、手動で変換するとしたら

  1. 「翻訳したい文章~~Enterでも翻訳できます。」欄に文字を入れる
  2. 画面中央にある「翻訳」ボタンを押す
  3. 結果が表示される

という流れになりますね。

ということは、「翻訳したい文章~~Enterでも翻訳できます。」の欄に文字を入れる動作をプログラムで再現してあげればいいことになります。

ソースコードから、form送信エリアを検索する

探す目的個所が分かったら、ソースコード上でその要素を探していきます。

検索する文字列は「翻訳したい」にしましたが、もしヒット数が多い場合は、検索ワードを増やして対象を限定していけばいいです。

見つかりましたね。

  1. まず、「翻訳したい」をキーワードとして探す
  2. 次に、その要素が入っているフォームを見つける
  3. 最後に、actionの中にあるURLを探す

この手順で、探していきます。

この時点で分かった情報は以下です。

  • 情報の取得方法は「POST」である
  • 送信先のURLは「/world/english/」である
  • 変換時に送信している情報は以下である
    • _qf__formTrans
    • _token
    • auto_detect_flg
    • wb_lp
    • swb_lp
    • count_translation
    • re_translation
    • tdg_id
    • td_id
    • before_lang
    • after_lang

送信に必要な値を特定する

これは実際に試しに動かして確認します。

使うツールは「Google Chrome」です。

  1. Google Chromeで「F12」を押して開発者ツールを起動する
  2. 実際にサイトで値を入れたりボタンを押したりして動作を解析する
  3. 送信している値を確認する

  1. Network を選択する(黒枠)
  2. 赤丸にする(緑枠)
  3. Headers を選択する(赤枠)
  4. English/ を選択する(黄色枠)・・・これはサイトによって変わります
  5. Form Data を確認する(紫枠)

この情報を見ると、wb_lpをENJAにすれば英日変換できそう。beforeに変換元の文字を入れればよさそう。であることが分かりますね。

ここまでわかれば、あとはプログラムに落とし込むだけです。

PHPで処理を書いてみる

<?php

$url = "https://www.excite.co.jp/world/english/";


$postData = array(
  "before" => "【 N MINT in BOX 】 Pentax 67 6x7 Remote Battery Cord for Pentax 67 6x7 from JAPAN",
  "wb_lp" => "ENJA",
);


/*****************************
 cURLでリクエスト送信
*****************************/
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST,              true);
curl_setopt($ch, CURLOPT_POSTFIELDS,        http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,	true); 

$result = curl_exec($ch);
curl_close($ch);


/*****************************
 正規表現で変換文字を取り出す
*****************************/
preg_match('/<textarea id="after" class="resizable" cols="37" rows="13" name="after">(.*?)<\/textarea>/i', $result, $m );
var_dump($m[1]);

結果が以下になります。

string(130) "JAPANからのペンタックス67 6x7のためのBOX 】ペンタックス67 6x7リモートバッテリーコードの【 N MINT"

実際の動作と見比べてみる

同じURLに対してPOSTして送信しているので、当然って言えば当然ですが、プログラムから変換した結果と、手動でサイトから変換した結果は同じですね。

補足:日本語→英語に変換するとき

リクエストを以下のようにすれば可能です。

■リクエスト

  "before" => "JAPANからのペンタックス67 6x7のためのBOX 】ペンタックス67 6x7リモートバッテリーコードの【 N MINT",
  "wb_lp" => "JAEN",

結果

string(81) "N MINT of a BOX] Pentax 67 6x7 remote battery cord for Pentax 67 6x7 from Japan ["

まとめ

いかがだったでしょうか。

スクレイピングはGoogle Chromeを使うことで、いとも簡単に実現することができます。

しかし、プログラムから行うということは短時間に大量のリクエストを相手サーバに送信することを意味しています。

もしループで複数のリクエストを送るときはSleep関数を使って待機処理を載せたり、負荷がかかりすぎないように検討してプログラミングしていきましょう。

用法さえ守っていれば、スクレイピングはとてもいい情報収取ツールになります。

ぜひ、スクレイピングを使いこなしてみてください。

参考サイト

JavaプログラムからExcite翻訳を利用