カツオ @SpringBootとVue.jsでWebサービス開発中

起業、転職、サラリーマン生活、Webサービス、アプリ、働き方、プログラミング、Java、JavaScript

java

【JAVA】phantomjsでスクレイピング(Googleの検索結果をクローリング取得)

投稿日:

やること

Googleのキーワード検索結果の一覧URLを取得します。ポチポチとコピペしてもいいのですが、一応エンジニアの端くれということで、JAVAを使ったスクレイピングシステムを作ってみます。

スクレイピング初めてだったのですが、そんな苦労なく動作させることができました。

今回はphantomjsというヘッダレスブラウザを利用しています。ヘッダレスブラウザとは、人が見るための画面表示を持たないブラウザです。phantomjsを利用すると、webサイトを開いた際に、javascriptの動作の結果出来上がったHtmlをスクレイピングすることが簡単にできます。

今どきのサイトってサイトアクセスした後にjavascriptでHTMLをレンダリングするみたいな構成のものがあります(Googleもそうだった)。そういったサイトをクローリングする際にphantomjsは実装難易度という観点ではとても役に立つと思います。

利用したもの

  • phantomjs
  • JAVA
  • maven
  • selenium、jsoup

 

phantomjsの準備

http://phantomjs.org/

こちらから最新版をDLしてください。DL後、解凍すると、bin/phantomjs.exeができあがります。phantomjs.exeをプロジェクトのルートフォルダに格納してください。

だいたい、\workspace\プロジェクト名\○○ というフォルダ構成かと思います。プロジェクト名フォルダ直下に格納すればOKです。

 

プロジェクトの作成

mavenプロジェクトのシンプルなプロジェクト作成を選択。

単純にスクレイピングする実験的なプロジェクトなので。

 

pom.xmlの設定

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sumi</groupId>
<artifactId>Scraping</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.codeborne/phantomjsdriver -->
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>phantomjsdriver</artifactId>
<version>1.4.4</version>
</dependency>
</dependencies>
</project>

 

スクレイピング用のプログラミング

 

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
public static void getHtmlByPhontom() {
//「ほりえもん」で検索したURL
String url = "https://www.google.com/search?source=hp&ei=q10NW-HcJcqB8wWIqYaoCA&q=%E3%81%BB%E3%82%8A%E3%81%88%E3%82%82%E3%82%93&oq=%E3%81%BB%E3%82%8A%E3%81%88%E3%82%82%E3%82%93&gs_l=psy-ab.3..0i4k1l8.1287.2490.0.2831.10.9.0.0.0.0.192.647.0j4.4.0....0...1c.1j4.64.psy-ab..6.4.645.0..0j0i131k1.0.47GF08lHNE8";
//出力するファイル名
String filename = "output.txt";
File file = new File(filename);
try {
//ファイルオープン
FileWriter filewriter = new FileWriter(file);
//URLへアクセス
WebDriver driver = new PhantomJSDriver();
driver.get(url);
Boolean loop = true;
int counter = 0;
//Googleの次へボタンが押せなくなるまで繰り返し
//検索結果ページのリンク一覧をファイルへ保存
while(loop) {
counter++;
System.out.println("Page : " + counter);
List<WebElement> elements = driver.findElements(By.cssSelector("h3.r>a"));
for(WebElement e : elements) {
System.out.println(e.getText());
System.out.println(e.getAttribute("href"));
filewriter.write(e.getText() + "\t" + e.getAttribute("href") + "\r\n");
}
try {
WebElement nextbtn = driver.findElement(By.linkText("次へ"));
nextbtn.click();
} catch (NoSuchElementException e) {
//要素がなくなった場合、ループを終了する
loop = false;
}
}
System.out.println("End:");
filewriter.close();
driver.quit();
} catch (IOException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
}
}
}

 

こんな感じで動きました。

かなり簡単で助かります!!

 

-java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

【SpringBoot入門】Spring Boot+JPAで複数テーブル結合処理

SpringBootのプログラミングネタ連投で失礼します。 先日、PostgresSQL+SpringBootでDBアクセスから画面表示までの実装を行いました。 【SpringBoot入門】Sprin …

no image

【SpringBoot+PostgresSQL】JPA EntityでIDを自動採番する

SpringBootでDBへデータ登録する際に主キーを自動で採番するやり方です。個人的に詰まってしまい色々調べたので、まとめておきます。 やりたいこと テーブルのキーを自動で採番する postgres …

no image

【mybatis】Insert時にシーケンスで自動採番されたキーを取得する【SpringBoot】

サーバーサイドはSpringBootを使って絶賛Webサービスを開発しています。カツオです。 SpringBootのDBアクセスはJPAが主流なのかもしれませんが、JPAだとデータモデルとJavaのク …

no image

【SpringBoot入門】Spring Boot + PostgreSQLの設定・DB検索

この週末にSpringBootの入門書を1冊写経しながら勉強しました。入門書の中ではDBアクセスがHSQLDBのみの例しかなかったので、Webサイトなどを参考にしつつ、PosgresSQLとの接続を試 …

no image

【SpringBoot】faicon(ファビコン)の設定方法

SpringBootの場合、デフォルトだとfavicon(ファビコン)にSpringBootの葉っぱの画像が使われています。さすがにそのままサービスをローンチするわけにもいかないので、favicon( …