C#+SeleniumでWebスクレイピングをする
こんにちは。
今回は、Seleniumを使ってWebスクレイピングをしていきたいと思います。
Webスクレイピングといえば、Pythonみたいなところもありますが、Seleniumを使えば、C#でも簡単にスクレイピングを行うことができるので、今回はC#を使って実践していきたいと思います(単純にC#が好きなだけですが。笑)。
ソースコードはGitHubに載せておりますので、合わせて確認してみてください。
数十ステップ程度の非常に簡単なプログラムになります。
スクレイピングをする対象はQiitaというエンジニア向けの技術的な情報共有を行うサービスにしました。
Qiitaにログインをすると、最近の人気記事といったトレンド情報が記載されているページに移行します。
なので、Qiitaにログインしてその日のトレンド情報を自動で取得するまでをSeleniumで行ってみたいと思います(ほんなら、Qiitaで技術共有しろやといったコメントはお控えください。笑)。
Seleniumのインストール
もともとSelenium自体はWebアプリなどのテストを自動で行うツールになります。
ブラウザごとにテストを行えるように、使用するブラウザを指定して使うことになるのですが、今回はMicrosoft Edgeを使うことを想定します。
Seleniumを使うためにはプロジェクトに以下のライブラリをNugetからインストールする必要があります。
・Selenium.Support
・Selenium.WebDriver
・Selenium.WebDriver.MSEdgeDriver
一番最後の「Selenium.WebDriver.MSEdgeDriver」ですが、これはMicrosoft EdgeでSeleniumを使う場合に必要なライブラリになります。他のブラウザを使用する場合は、それぞれのブラウザにあったライブラリをインストールする必要がありますので、ご注意ください。
スクレイピング方法
実際にソースコードを確認しながら、スクレイピング方法について紹介してきます。
まず、ブラウザを起動するためドライバクラスを生成します。
IWebDriver driver = new EdgeDriver()
「EdgeDriver」となっているところは立ち上げるブラウザによって変わります。
この状態でコンパイルして実行すると、勝手にMicrosoft Edgeが起動します。
起動したMicrosoft Edgeには「Microsoft Edgeは、自動テストソフトウェアによって制御されています。」という文言が表示されていると思います。
また、実行した際に、以下のようなエラーが表示されることがあります。
このエラーが表示された際には、アプリが格納されているフォルダにある「msedgedriver.exe」というファイルを「MicrosoftWebDriver.exe」に変更して再度実行してみてください。
Qiitaにログインするには以下のようなコードを記述します。
// URLを取得
driver.Url = @"https://qiita.com/login?redirect_to=%2F";
// ログイン名(メールアドレス)を入力
IWebElement element = driver.FindElement(By.Id("identity"));
element.SendKeys("mail address");
// パスワード名を入力
element = driver.FindElement(By.Id("password"));
element.SendKeys("password");
// ログインボタンをクリック
element = driver.FindElement(By.Name("commit"));
element.Click();
特定のURLを指定するには、「IwebDriver」クラスの「Url」というプロパティにアクセスします。
URLを指定すると、自動的に起動したブラウザ画面もそのURLに遷移するのが確認できます。
特定の要素を取得するには「FindElement」関数を使用します。引数として「By.Id」や「By.Name」を与えていると思いますが、これはHTMLのどの属性を使って要素を取得するかを決めています。「By.Id("identity")」ではId属性に「Identity」という名前が付けられているものを取得します。
要素を取得し、その要素にテキストを入力したい場合は、取得した要素に対して「SendKeys」関数を、ボタンをクリックしたい場合は「Click」関数を実行します。
ログイン名とパスワードが正しければ、Click関数が実行された後に、ログイン後の画面に自動的に遷移します。
ログイン後の画面からトレンド情報を取得するには、以下のコードを記述します。
// 1日のトレンド記事をまとめて取得
List<IWebElement> elements = driver.FindElements(By.ClassName("tr-Item_title")).ToList();
// 記事のタイトルをコンソールに表示
foreach(IWebElement ele in elements)
{
Console.WriteLine(ele.Text);
}
トレンド記事のタイトルには同じClass属性が使われているので「tr-Item_title」という名前のClass属性が使われている要素をまとめて取得しています。上の例とは違い「FindElements」関数を使用していることに注意してください。複数形の「s」がついているかどうかが違います。
取得した要素をリストに変換し、あとは一つずつコンソールに表示するだけです。
コンソールの結果を確認すると、確かに記事のタイトルが取得できています。
まとめ
Seleniumを使うと、簡単にWebスクレイピングを行うことができます。
要素の取得には多少のHTMLの知識が必要になりますが、C#を覚えるよりかは簡単なはずです。笑
皆さんもぜひ試してみてくださいね!
最後までお読みいただきありがとうございました。
この記事が気に入ったらサポートをしてみませんか?