\r\n\r\n

seleniumを使ったWebクローラの作り方

ウェブクローラーは、ウェブサイトの定型作業を自動化するのに非常に有効です。selenium要素でクローラーを作り、人間と同じようにWebサイトと対話することができます...

Webクローラは、Webサイトで日常的に行われている作業の一部を自動化するのに便利で、人間と同じようにサイトと対話するクローラを作成することができます。

selenium-web-crawler

以前の記事で、pythonモジュールのscrayを使ったウェブクローラーの書き方の基本を説明しました。この方法の限界は、クローラーがjavascriptをサポートしていないことです。ユーザーインターフェースの管理にjavascriptを多用しているサイトでは、この方法は**うまくいきません**。この場合、Google Chromeを利用するクローラーを書くことで、通常のユーザー主導のChromeブラウザと同じようにjavascriptを扱えるようになります。

googlechromeを自動化するには、Seleniumというツールを使用する必要があります。プログラムとブラウザの間に位置し、プログラムを通してブラウザを駆動させるためのソフトウェアコンポーネントです。今回は、googlechromeを自動化するための一連の流れをご紹介します。これらのステップは通常、以下を含みます。

  • セレンの設定
  • googlechromeインスペクタでWebページの個別部分を識別する
  • googlechromeを自動化するjavaプログラムを作成する。

この記事の目的のために、Javaからgooglemailを読む方法を調べましょう。Googleはメールを読むためのAPI(アプリケーションプログラミングインターフェース)を提供していますが、この記事ではSeleniumを使ってgooglemailと対話し、このプロセスを実演します。javascriptを使用するため、Seleniumの学習には適しています。

セレンの設定

ウェブドライバ

前述のように、Seleniumは別プロセスとして動作し、Javaプログラムに代わって操作を行うソフトウェアコンポーネントで構成されています。このコンポーネントはウェブドライバーと呼ばれ、お客様のコンピューターにダウンロードされる必要があります。

ここをクリックしてSeleniumのダウンロードサイトに移動し、最新版をクリックして、あなたのコンピュータのOS(Windows、LinuxまたはMacOS)に適したファイルをダウンロードしてください。chromedriver.exeを含むファイルです。適当な場所(例:C:㈳WebDrivers㈳chromedriver.exeファイル)に解凍してください。この場所は、後ほどjavaプログラムの中で使用する予定です。

ジャバモジュール

次に、Selenium を使用するために必要な java モジュールをセットアップします。Mavenを使用してjavaアプリケーションを構築していると仮定して、以下の依存関係をPOM.xmlファイルに追加してください。

 <dependencies>
<依存関係>について
<groupId>org.seleniumhq.selenium</groupId
<artifactId>selenium-java</artifactId>.
<バージョン>3.8.1</バージョン>。
</dependency>。
</dependencies

生成処理を実行するには、必要なモジュールをすべてダウンロードし、コンピューターにセットアップしておく必要があります。

セレンへの第一歩

まずはseleniumから。最初のステップはChromeDriverのインスタンスを作成することです。

WebDriver driver = new ChromeDriver();

これでGoogle Chromeのウィンドウが開き、Googleの検索ページに移動できるようになるはずです。

driver.get("http://www.google.com");

検索を行うために、テキスト入力要素への参照を取得する。テキスト入力要素の名前は q です。このメソッドを使用して、ページ上の HTML 要素を検索します。 WebDriver.findElement file() を実行します。

WebElement element = driver.findElement(By.name("q"));

sendKeys() メソッドを使用すると、任意の要素にテキストを送信することができます。検索語を送信して、すぐに検索が始まるように改行で終わらせてみましょう。

element.sendKeys("terminator
");

さて、検索が開始され、結果ページを待つ必要がありますが、このようにすることができます。

new WebDriverWait(driver, 10)
.until(d -> d.getTitle().toLowerCase().startsWith("terminator"));

このコードは基本的に、10秒待って、ページタイトルがターミネーターで始まったら戻るようにSeleniumに指示します。ラムダ関数を使って、待機する条件を指定しています。

これで、ページのタイトルを取得することができます。

System.out.println("Title: " + driver.getTitle());

セッション終了後、ブラウザウィンドウを閉じるには、次のようにします。

driver.quit();

これは、java を使って selenium で制御される簡単なブラウザセッションです。見た目はシンプルですが、普通なら手で書くようなこともたくさん書けるようになります。

グーグルクロームのインスペクタを使用する

GoogleChromeInspectorは、セレン元素を特定するのに非常に便利なツールです。これにより、情報を抽出したり、ボタンをクリックするようなインタラクティブな動作をさせるために、javaの要素を正確にターゲットにすることができます。インスペクターの使い方の入門編です。

Google Chromeを開き、IMDbのforjustice League (2017)のページなどに移動してください。

対象となる要素、例えば映画の要約を探します。要約を右クリックして、ポップアップメニューから「チェック」を選択します。

how to make a web crawler with selenium

要素」タブから、要約文は要約文のカテゴリーを含むdivであることがわかります。

how to make a web crawler with selenium

選択にはcssまたはxpathを使用

Seleniumは、CSSを使ったページからの要素の選択をサポートしています。(CSS2 は CSS の方言に対応しています)。例えば、上記のIMDbのページから要約文を選択する場合は、次のように記述する。

WebElement summaryEl = driver.findElement(By.cssSelector("div.summary_text"));

また、XPathを使用して、非常によく似た方法で要素を選択することができます(仕様はこちらをご覧ください)。同様に、要約文を選択する場合は、次のようにします。

WebElement summaryEl = driver.findElement(By.xpath("//div[@class='summary_text']"));

XPathとCSSは機能が似ているので、使い慣れた機能を利用することができます。

googlemailをjavaから読み込む

では、もっと複雑な例として、googlemailの取得について見てみましょう。

Chromeドライバを起動し、gmail.comに移動して、ページが読み込まれるのを待ちます。

WebDriver driver = new ChromeDriver();
driver.get("https://gmail.com")。
new WebDriverWait(driver, 10)
.until(d -> d.getTitle().toLowerCase().startsWith("gmail"));

次に、Eメール欄(id identifierIdという名前)を探し、Eメールアドレスを入力します。次へ」ボタンをクリックし、パスワードのページがロードされるのを待ちます。

/* Type in username/email */
{
driver.findElement(By.cssSelector("#identifierId")).sendKeys(email);
driver.findElement(By.cssSelector(".RveJvd")).click();
}
new WebDriverWait(driver, 10)
.until(d -> ! d.findElements(By.xpath("//div[@id='password']")).isEmpty()) );

ここで、パスワードを入力し、再度「次へ」ボタンをクリックして、Gmailのページがロードされるのを待ちます。

/* Type in password */
{
運転手
.findElement(By.xpath("//div[@id='password']//input[@type='password']"))
.sendKeys(password);
driver.findElement(By.cssSelector(".RveJvd")).click();
}
new WebDriverWait(driver, 10)
.until(d -> ! d.findElements(By.xpath("//div[@class='Cp']")).isEmpty()) );

メールラインのリストを取得し、各エントリーにループをかける。

List<WebElement> rows = driver
.findElements(By.xpath("//div[@class='Cp']//table/tbody/tr"));
for (WebElement tr : rows) {.
}

各エントリについて、Fromフィールドを取得します。セッションの参加人数によっては、Fromエントリに複数の要素が含まれることがあることに注意してください。

{
/* From Element */
System.out.println("From:")。
for (WebElement e : tr
.findElements(By.xpath(".//div[@class='yW']/*")))){
System.out.println(" " + )
e.getAttribute("email") + ", " +.
e.getAttribute("name") + ", " +.
e.getText())。
}
}

さあ、テーマを出してください。

{
/* 主題 */
System.out.println("Sub: " + tr.findElement(By.xpath(".//div[@class='y6']")).getText()));
}

とメッセージの日付と時刻が表示されます。

{
/* 日付/時刻 */
WebElement dt = tr.findElement(By.xpath("./td[8]/*")));
System.out.println("Date: " + dt.getAttribute("title") + ", " +")
dt.getText())。
}

ページ内のメール行の総数です。

System.out.println(rows.size() + " mails.");

最後に、終わったので、ブラウザを終了します。

driver.quit();

要約すると、Seleniumとgooglechromeを組み合わせて使うことで、javascriptを多用するサイトをクロールすることができます。googlechromeのインスペクタを使えば、要素から抽出したり、要素とのやりとりに必要なCSSやXPathを簡単に計算することができます。

seleniumを使用することで恩恵を受けるプロジェクトがあるか、またどのような問題に直面しているか、以下のコメント欄にご記入ください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ