目指せプログラマー

アラサーが仕事辞めてプログラマーを目指す

学習~seleniumを使ったWebスクレイピング~

こんにちは、seleniumを使ったスクレイピングは最近の学習で一番やってて楽しかった項目です。

参考にしたサイト

scraping-for-beginner.herokuapp.com

 

解説もあったとても勉強になりました。

このサイトを使わせていただきプログラムを作りました。

github.com

 

画像取得プログラム作成

上記サイトで学んだあとは、ブログ上にUPされている漫画の画像を保存するプログラムを作成しました(違法サイトではありません)

作成していく中で問題点がいくつかあり試行錯誤してましたが結局原因がわからなかったものもいくつかありました。

ホーム画面から個別記事リンクを取得する際にたまに関係ないリンクを拾ってしまう

そのサイトには各記事のブロックに2つの<a>タグが含まれており、基本的に目的の要素を取得できてましたがたまにSNSのリンクを拾ってしまう。

「対応」

/**
* ページ内の個別記事URLをリストに格納する。
* @param thumbBlockList
* @return 個別記事のURLリスト
*/
public List getLinkList(List thumbBlockList, WebDriver driver) {
  List hrefList = new ArrayList();
  thumbBlockList.forEach(element -> {
    List href = element.findElements(By.tagName("a"));
    hrefList.add(href.getLast().getAttribute("href"));
  });
  return hrefList;
}

 

結局いまいち原因がわからず、リストで取得してその中の最後の要素を使うようにしました。SNSのリンクを拾ってしまうときはリストには{SNSのリンク,欲しいのリンク}のように格納されている為、これでSNSのリンクに邪魔されることはなくなりました。

 

ブラウザが止まる

これも原因がわからなかったのですが、プログラムが動作していく中で不定期に動きが止まりTimeOutになってしまうことがありました。

Waitを加えてみたりと対応をしましたが変わらずで最終的にTimeOutExeptionが発生したら直前からリスタートさせるようにしました。

while (true) {
 try {
	ervice.getImage(drive, access);
 } catch (NoSuchElementException e) {
	// 取得できる要素がなくなった
   System.out.println("画像取得完了");
   break;
 } catch (TimeoutException e) {
	// タイムアウト発生した場合、直前からやり直す
	System.out.println("やり直し");
	continue;
 }
}

こんなところで、seleniumは日常生活でも役立ちそうな気がしました。

ただ、スクレイピングがOKかどうかはサイト次第のようでそこはしっかりと調べたうえで行いたいと思います。