スクレイピングのコードを自作してみる
スクレイピングクラスを自作してみる
プログラミングの勉強や調べ物をしてるとスクレイピングという言葉を見かけることが多いと思います。スクレイピングとは、あるサイトに記載されている情報の収集をプログラムで自動化することを言います。
人がわざわざサイトにアクセスし内容をメモして、また次のサイトにアクセスして。。。という行動を自動化させ、効率的に必要な情報を集めているのですね。
おそらくスクレイピングで検索をかけるとpythonがよく出てくると思います。pythonにはスクレイピングに関するライブラリなどが充実しているので、簡単にコードを書くことが可能です。
しかし私はpythonはほぼ未経験です。これを機にpythonを勉強してもよいのですが何を間違えたのか、今回私はC#で書き、かつライブラリを使用せずに自作でスクレイピング用のコードを書いてみようと思いました。笑
なので、今回はスクレイピングとはを簡単に勉強し、自作したコードについて書いていこうかと思います。
スクレイピングとは
さきほど記述しましたが、スクレイピングとは、プログラムを使用してWebサイトから自動的に情報を収集することを指します。これにより、自分自身の労働を経減らすことができるので効率よく情報集ができるようになります。
これなら調べ物は全てスクレイピングにしてしまえば良いのでは?と思うかもしれません。しかし、このスクレイピングには注意すべきこともあり、一歩間違えると犯罪になる可能性もあります。そのため、スクレイピングをする場合には自己責任でお願いします。。。
何がどう犯罪になるのか?ですが、分かりやすいところでいくと著作権侵害などですね。
情報収集するためにアクセスするサイトの情報は、あくまでもそのサイトを運営している企業などものになります。そのため、取得自体は問題にならなくても、取得したデータを公開したりしてしまうと著作権違反になってしまう可能性があります。
また、取得する際にも注意が必要で、短時間に何度もサーバーにアクセスすることでそのサーバーに不可をかけ本来の運営を妨げてしまうと犯罪になるかもしれません。例えば、運営が想定しない方法でサーバーにアクセスするので動産不法侵入に当たる可能性もあります。
スクレイピングの可否については、事前に対象のサイトについて利用規約などを確認してみましょう。場合によっては、サイトの運営自体がスクレイピング行為を明示的に禁止している場合もあります。
明示的な記述がない場合でもrobots.txtを確認する必要があります。確認方法は、次のURLをたたいてみましょう。「https://対象のサイトアドレス/robots.txt」
表示される画面に、運営側がアクセスしてはいけないURLをまとめられています。
と言っても、しっかり確認し、負荷のかけない方法でスクレイピングを行う分には問題ないので、安心してください。
スクレイピングの仕組み
では、早速スクレイピングの仕組みを勉強していきましょう。
簡単に説明すると、「サイトにアクセス」⇒「HTMLを取得」⇒「欲しい部分(タグ)を抽出する」になり、これを繰り返します。
なので、実装する部品としては「HTMLの取得」と「タグ抽出」の2つになり、意外と簡単で、特別こだわらなければ1時間くらいで実装できると思います。
例えば、大文字で表現している部分を抽出したいのであれば、<b>タグについて抽出するコードを書きます。
抽出するためには「開始タグと終了タグの間に任意の文字」という正規表現を使用し、マッチした文字列を抽出するという下記のような記述をします。
string str = ""; // 任意のHTML文字列 string key = "<b>.*</b>" MatchCollection matches = Regex.Matches(str, key); foreach(Match match in matches) { // 任意の処理 }このように、変数keyの部分を適宜修正することで、いろいろなタグや、条件を加えた抽出が可能となります。
高度化してみる
先ほどのコードでスクレイピング自体は可能です。しかし、抽出する部分を絞りたい時などは正規表現部分を修正する必要があります。
また自作メソッドとして使用していくのであれば、ユーザ側がタグ名などを選択できるようにする必要もあるかと思います。メソッドの引数にタグ名や条件などを指定し処理する仕組みを構築したいと思います。
例えば、抽出したいタグはpタグで、classがmainである次のような部分を抽出したい場合のコードを構築します。
・<p class="main">pタグの内容</p>
作成するメソッド名はGetSelectTagとし、戻り値はstringです。
private static string GetSelectTagElement(string reStr, string tag, string element, string option) { string reStr = ""; string key = "<" + tag + " " + element + "=\"" + option + "\".*>.*</" + tag + ">"; MatchCollection matches = Regex.Matches(str, @key); foreach(Match match in matches) { reStr = match.Value; } return reStr; }
string str = ""; // 任意のHTML文字列 Console.WriteLine( GetSelectTagElement(str, "p", "class", "main") );このような感じで、変数keyを修正することで複雑なタグにも対応が可能になります。しかし、上記メソッドのままでは汎用性は低いですが、これを軸に新しいメソッドを作成していくと良いと思います。
自作クラスとして
任意のタグを抽出するメソッドの作成まで行いました。しかし中にはタグ内で改行されているものや、そもそも抽出するのは本文部分でタグなどは必要ない。などに対応する必要があります。
正直改良点などは多くあると思いますが、実際にスクレイピング用のクラスを自作しました。また、実際のサイトから情報を取得できるようなプログラムも作成しました。
プログラムコードはGitに公開していますので、改善点などあればコメントなどいただけると嬉しいです。なおこのプログラムで情報収集できますが何かあったときは自己責任でお願いします。
・Gitはこちら
まとめ
ということで、今回はスクレイピングについて勉強し、スクレイピング用の自作クラスの作成を行いました。
基本的にはライブラリを使用して簡単に書くものだと思いますが、ギリギリ自作できそうだったのでちょっと頑張ってみました。
もっと色々なコードを書いてみたいですね。これからも頑張ります。
今回はこの辺で、ではまた!
コメント
コメントを投稿