【初心者のPython入門】SeleniumでGoogle mapsのデータをスクレイピング





こんにちは、スギです!

先日、Seleniumを使ってツイッターのフォロー自動化を行いました。

それに引き続き、今回はSeleniumを使ってGoogle mapsからデータを取得していきたいと思います。

 

まだ、Seleniumのインストールが完了されていない場合は、こちらの記事をご覧になられてからこちらの記事を読み進めて頂ければと思います。

【初心者のpython入門】seleniumでログイン自動化!〜Twitter編〜

2019.05.07

汎用性の広いPythonを0から習得するためのフロー及び実際にPythonで開発を行い開発案件を獲得するまでの筋道について解説しているチュートリアル資料と

コーディングの参考となる実際にPythonを使って作ったツールのソースコードを無料で配布していますので、こちらも併せてご覧ください。

初心者・入門者でも30日間で学習できるおすすめPython学習方法

 

おすすめのPython学習サービスをまとめてみました。挫折することなく一直線にエンジニアを短期集中で目指している人はこちらから確認してください。 

【おすすめ】Python学習サイトPyQが初心者に選ばれる理由

プログラミングを学ぶ上で作りたいものがない人へ提案させてください

 

スクレイピングとは

まず、作業に入る前にスクレイピングとは何なのかザックリと説明していきます。

一言で言えば、Webページの情報を取得することができる技術の事です。

普段よく見ているサイトや情報を一々検索を行うのは面倒ですが、スクレイピングの技術を使うことにより、面倒な作業をすることなく自分が欲しい情報が手に入る事ができます。

この技術は個人で実用的に使用する事はあまりありませんが、会社や個人経営されている大きな規模になると、リストの取得によく使われています。

こういったスクレイピング技術を使いこなせるようになれば、フリーランスなど個人で稼ぐ時にとても貴重な人材となれますので、是非この機会にマスターしてしまいましょう。

Pythonでのスクレイピングでは大きく分けて二つのライブラリを使用したやり方が主流となっています。

・Beautifulsoup

・Selenium

 

Beautifulsoup

BeautifulSoupモジュールは、pythonのライブラリの一つでスクレイピングに特化した機能を備えています。

本来、Webページは複雑な構造をしていますが、こちらのライブラリを使ってWebページのデータを整形を行います。

このように、こちらのライブラリはスクレイピングをしやすいような処理をしてくれるのです。

Selenium

Seleniumはブラウザに表示される要素を操作し、取得してどういう状態になっているかをテストできます。

元々Seleniumという技術はスクレイピングとしての活用ではなく、ブラウザに表示される挙動確認のために使われていました。

なので、Beautifulsoupに比べて使いやすさには劣りますが、動的にブラウザの挙動が確認できるので修正等の確実性が高いです。

それ以外にもブラウザを操作するので、スクリーンショットや画面のスクロールなどBeautifulsoupではできない動作ができて便利なライブラリとなっています。

プログラムの概要

それでは、seleniumによるGoogle mapsを使ったデータの取得方法を解説していきます。

 

こちらが今回の全体のコードになります。

#seleniumとbeautifulsoupをインポート
import chromedriver_binary
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import requests
import bs4

#検索蘭にキーワードを記入
keys = input("検索キーワード:")
#Google Chromeのドライバを用意
driver = webdriver.Chrome()

#Google mapsを開く
url = 'https://www.google.co.jp/maps/'
driver.get(url)

time.sleep(5)

#データ入力
id = driver.find_element_by_id("searchboxinput")
id.send_keys(keys)

time.sleep(1)

#クリック
search_button = driver.find_element_by_xpath("//*[@id='searchbox-searchbutton']")
search_button.click()

time.sleep(3)

login_button = driver.find_element_by_class_name("section-result-title")
login_button.click()

time.sleep(3)

page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

title = soup.find(class_="GLOBAL__gm2-headline-5 section-hero-header-title-title")
link = soup.find_all(class_="section-info-text")


print("-------------------------------")
print(title.text.strip())
print(link[0].text.strip())
print(link[2].text.strip())
print(link[3].text.strip())
print("-------------------------------")

 

今回のコードはSeleniumとBeautifulsoupの両方を使って、スクレイピングを行っていきます。

こちらのコードの概要はGooglemapsにて地域やジャンルのデータを入力してその出力結果から一番最初のデータ(店名、住所、Webサイトのリンク、電話番号)を取得してくるプログラムになります。

 

このプログラムを作成するにあたって以下の内容を行います。

・必要なモジュールのインポート

・ブラウザを操作するドライバーを用意

・Google mapsを開く

・検索欄にデータを入力してクリック

・データの整形を行い、取得したいデータを選択

一つずつコードを使って解説していきます。

必要なモジュールのインポート

#seleniumとbeautifulsoupをインポート
import chromedriver_binary
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import requests
import bs4

 

ここではimport文を使ってSelenium、Beautifulsoupをインポートしています。

さらに処理する時間を保持するtimeモジュールやパスを通すchromedriver_binaryモジュールをインポートしています。

これにより、今回のプログラムを作成する準備が整いました。

ブラウザを操作するドライバーを用意

#Google Chromeのドライバを用意
driver = webdriver.Chrome()

 

今回はGoogleにて提供されている、Google Chromeのブラウザを使用していきます。

なので、予めChromeを操作するためにドライバーのインストールを行ってください。

→http://chromedriver.chromium.org/downloads

ドライバーとは

Seleniumをインストールしただけではブラウザを操作することができません。

操作するためにはドライバーをインストールする必要があります。

車を操作するには運転手が必要ですよね。

車がブラウザ、運転手がドライバーと思っていただければ分かりやすいかと思います。

 

※ドライバーをインストールする際の注意点

ドライバーをインストールする場合、ご自身が扱っているChromeと同じバージョンでインストールする必要があります。

不具合を避けるためにも、最新の状態にアップグレードしておいてください。

やり方の詳細は下記のリンクを貼っておきます。

→https://support.google.com/chrome/answer/95414?co=GENIE.Platform%3DDesktop&hl=ja

Google mapsを開く

#Google mapsを開く
url = 'https://www.google.co.jp/maps/'
driver.get(url)

time.sleep(5)

 

次にGoogle mapsを開いていきます。

変数にGoogle mapsのurlを格納し、その格納した変数をドライバーを使って開いています。

ここは特に難しくありませんね。

検索欄にデータを入力して、クリック

 

Google mapsを開くと以下の画像が表示されるかと思います。

今回のコードは左上の赤枠にデータを入力して、クリックするところまで行います。

#検索蘭にキーワードを記入
keys = input("検索キーワード:")

#データ入力
id = driver.find_element_by_id("searchboxinput")
id.send_keys(keys)

time.sleep(1)

#クリック
search_button = driver.find_element_by_xpath("//*[@id='searchbox-searchbutton']")
search_button.click()

time.sleep(3)

login_button = driver.find_element_by_class_name("section-result-title")
login_button.click()

time.sleep(3)自分が取得したい地域とカフェや美容院などのジャンルを変数に格納します。

 

今回は渋谷 カフェを入力します。

それからデベロッパーツールにて検索フォームの要素を取得し、そこに先ほどの変数を入力するようにしています。

そして、クリックする要素を取得してクリックを行います。

 

すると、以下の画像になります。

 

ここでデータを取得することも可能ですが、今回取得する電話番号やWebサイトのリンクは検索結果の一覧から各個別の詳細にもう一度クリックをする必要があります。

なので、赤枠の要素を取得しクリックします。

ようやくスクレイピングをする準備が整いました。

 

データの整形を行い、取得したいデータを選択

#HTMLを解析
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

#取得したい要素を取得
title = soup.find(class_="GLOBAL__gm2-headline-5 section-hero-header-title-title")
link = soup.find_all(class_="section-info-text")

#出力
print("-------------------------------")
print(title.text.strip())
print(link[0].text.strip())
print(link[2].text.strip())
print(link[3].text.strip())
print("-------------------------------")

 

最後にスクレイピングを行います。

このままSeleniumにてデータを取得することも可能ですが、綺麗にデータを取得する際にはBeautifulsoupがオススメですので、今回はこのPythonライブラリを使用してスクレイピングしていきます。

※今回はGoogle mapsのデータ取得のために画面遷移が多く存在したので、Seleniumも使用しましたが、本来スクレイピングする際には基本的にBeautifulsoupで完結します。

先ほど詳細ページに画面遷移したことにより、以下のように表示されているかと思います。

今回は図の赤枠が今回データを取得する要素となります。

ここで、PythonライブラリBeautifulsoupを使ってHTMLのデータを整形していきます。

整形したデータの中から自分が取得したいデータが存在する要素を選択肢し、出力を行います。

そのまま取得した要素を出力すると、class名なども表示されてしまうため、.textにてHTML要素内の文字のみを出力するようにしています。

ターミナルには以下のように出力されていると思います。

また、今後もプログラミングに取り組み続けていく中で、実務に利用できる学びを身につけていかなければなりません。

実務に活かす際に学習として利用していたPython本が以下のものになります。

・PythonによるWebスクレイピング(オライリー出版)

・増補改訂Pythonによるスクレイピング&機械学習 開発テクニック(クジラ飛行机)

・Pythonクローリング&スクレイピング – データ収集・解析のための実践開発ガイド

プログラミング学習で作りたいものがない場合

独学・未経験から始める人も少なくないので、プログラミング学習の継続や学習を続けたスキルアップにはそれなりのハードルが設けられています。

また、プログラミング学習においても、学習者によってはすでに学習対象とするプログラミング言語や狙っている分野が存在するかもしれません。

そのため、費用を抑えて効率的にピンポイント学習で取り組みたいと考える人も少なくありません。

また、プログラミング学習において目的を持って取り組むことは大切ですが、『何を作ればいいかわからない。。』といったスタートの切り方で悩む人もいると思います。

そういったプログラミング学習の指標となる取り組み方について詳細に記載したまとめ記事がありますので、そちらも参照して頂けると幸いです。

プログラミングを学ぶ上で作りたいものがない人へ提案させてください

2019.11.21

Pythonに特化した学習を進めたい人へ

筆者自身は、Pythonista(Python専門エンジニア)としてプログラミング言語Pythonを利用していますが、これには取り組む理由があります。

プログラミングの世界では、IT業界に深く関わる技術的トレンドがあります。

日夜新しい製品・サービスが開発されていく中で、需要のあるプログラミング言語を扱わなければなりません。

トレンドに合わせた学習がプログラミングにおいても重要となるため、使われることのないプログラミング言語を学習しても意味がありません。

こういった点から、トレンド・年収面・需要・将来性などを含め、プログラミング言語Pythonは学習対象としておすすめとなります。

オンラインPython学習サービス – 『PyQ™(パイキュー)』

「PyQ™」は、プログラミング初心者にも優しく、また実務的なプログラミングを段階的に学べることを目指し、開発されたオンラインPython学習サービスです。

Pythonにおける書籍の監修やPythonプロフェッショナルによるサポートもあり、内容は充実しています。

技術書1冊分(3000円相当)の価格で、1ヶ月まるまるプログラミング言語Pythonを学習することができます。

特に、、、

・プログラミングをはじめて学びたい未経験者

・本、動画、他のオンライン学習システムで学習することに挫折したプログラミング初心者

・エンジニアを目指している方(特にPythonエンジニア)

かなり充実したコンテンツと環境構築不要なため、今すぐにでも学び始めたい・学び直したい、Pythonエンジニアを目指したい人におすすめです。

オンラインPython学習サービス「PyQ™(パイキュー)」
※技術書1冊分の価格から始めて実務レベルのPythonが習得できます

【おすすめ】Python学習サイトPyQが初心者に選ばれる理由

2020.03.07

 

まとめ

いかがでしたでしょうか?

今回はSeleniumとBeautifulsoupを使ったスクレイピングを解説していきました。

前回のツイッター自動化に比べて少し難しかったと思いますが、このようにSeleniumを使うことで様々なデータを取得できることがお分り頂けたかと思います。

Pythonを学習されている方なら是非扱って欲しいです。

ですが、サイトによってスクレイピングをしてはいけない事もありますので、そこに気を付けながら行ってみてください。

最後まで一読いただき、ありがとうございました!



ABOUTこの記事をかいた人

sugi

大学卒業後、IT企業に就職を果たす。システム開発・人工知能に触れながら大手企業と業務をこなす。2年半後脱サラし、現在フリーランス活動中。 2019年2月から起業する予定。 自社サービス及び製品を開発し、売り上げを立てている。