見出し画像

C#+SeleniumでWebスクレイピングをする

こんにちは。
今回は、Seleniumを使ってWebスクレイピングをしていきたいと思います。
Webスクレイピングといえば、Pythonみたいなところもありますが、Seleniumを使えば、C#でも簡単にスクレイピングを行うことができるので、今回はC#を使って実践していきたいと思います(単純にC#が好きなだけですが。笑)。

ソースコードはGitHubに載せておりますので、合わせて確認してみてください。
数十ステップ程度の非常に簡単なプログラムになります。

スクレイピングをする対象はQiitaというエンジニア向けの技術的な情報共有を行うサービスにしました。

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#を覚えるよりかは簡単なはずです。笑
皆さんもぜひ試してみてくださいね!

最後までお読みいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?