2021.06.05   2021.06.19

【Webスクレイピング入門】Google検索の上位サイトを件数指定して表示する方法


この記事では、Pythonを利用してGoogle検索の上位サイトを件数指定して表示する方法を紹介します。

比較的短いコードで実装できるため、プログラミング経験の少ない方でも、挑戦しやすい難易度となっています。

Webスクレイピングとは

Webスクレイピングとは"Web上から特定のデータを取得し、利用しやすく加工すること"です。

Pythonなどのプログラミング言語を使用し、プログラムを作成することで、自分の取得したいWeb上の情報を自動で取得・加工できるようになります。

ライブラリのインストール

PythonでWebスクレイピングをするにはrequestsBeautifulSoupを事前にインストールしておく必要があります。

Macならターミナル、Windowsならコマンドプロンプトを使用して、以下のコマンドを実行するとインストールできます。

requestsのインストール
pip install requests
BeautifulSoupのインストール
pip install beautifulsoup4

Google検索の上位サイトを件数指定して抽出するソースコード

次のようにコードを記述することで、Google検索の上位サイトを件数指定して抽出するこができます。

今回は検索キーワードにpython、表示するサイト件数を10件に設定しています。

import requests
from bs4 import BeautifulSoup

# Google検索するキーワードを設定
search_word = 'python'

# 上位から何件までのサイトを抽出するか指定する
pages_num = 10 + 1

print(f'【検索ワード】{search_word}')

# Googleから検索結果ページを取得する
url = f'https://www.google.co.jp/search?hl=ja&num={pages_num}&q={search_word}'
request = requests.get(url)

# Googleのページ解析を行う
soup = BeautifulSoup(request.text, "html.parser")
search_site_list = soup.select('div.kCrYT > a')

# ページ解析と結果の出力
for rank, site in zip(range(1, pages_num), search_site_list):
    try:
        site_title = site.select('h3.zBAuLc')[0].text
    except IndexError:
        site_title = site.select('img')[0]['alt']
    site_url = site['href'].replace('/url?q=', '')
    # 結果を出力する
    print(str(rank) + "位: " + site_title + ": " + site_url)
実行結果
【検索ワード】python
1位: python.jp: プログラミング言語 Python: https://www.python.jp/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAAegQIBxAB&usg=AOvVaw1zWPmv7T5_TAWg3bnqmmBE
2位: Welcome to Python.org: https://www.python.org/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjABegQICRAB&usg=AOvVaw1VKreO_0TrTsBwrZLUocgi
3位: Python チュートリアル — Python 3.9.4 ドキュメント: https://docs.python.org/ja/3/tutorial/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjANegQICxAB&usg=AOvVaw1bDyksh3P8l05md7m4NnLw
4位: Python - Wikipedia - ウィキペディア: https://ja.wikipedia.org/wiki/Python&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAOegQIChAB&usg=AOvVaw2h6Ef4-6GaL_9mbBi6v5Of
5位: Pythonってどんな言語? 特徴と歴史を『独習Python』から解説 ...: https://codezine.jp/article/detail/12457&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjATegQIDBAB&usg=AOvVaw2CsNq7v9DmTsrwa8wpNE7k
6位: Python入門 〜Pythonのインストール方法やPythonを使った ...: https://www.javadrive.jp/python/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAeegQIARAB&usg=AOvVaw1eO3_CVpXxxKsCtVl9vWak
7位: Pythonのダウンロードとインストール | Python入門: https://www.javadrive.jp/python/install/index1.html&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAfegQIAhAB&usg=AOvVaw18RA3hDQzun_a1PvXcBXG6
8位: Python | プログラミングの入門なら基礎から学べるProgate[プロ ...: https://prog-8.com/courses/python&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAgegQIAxAB&usg=AOvVaw0WS_ZSGAG25fV3jTtUqiyv
9位: Python3入門編のレッスン一覧 | プログラミング学習サービス ... - Paiza: https://paiza.jp/works/python3/primer&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAhegQICBAB&usg=AOvVaw20iAjA8YLRB_xDFBrPEhBH
10位: PyQ(パイキュー) - 本気でプログラミングを学びたい人のPython ...: https://pyq.jp/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAiegQIBhAB&usg=AOvVaw0-cv27f91EEeVZL8-f50eF

ソースコードの解説


ライブラリのimport


import requests
from bs4 import BeautifulSoup

冒頭でインストールしたライブラリをプログラム上で利用できるようにしています。


抽出条件の設定


# Google検索するキーワードを設定
search_word = 'python'

# 検索上位から何件までのサイトを抽出するか指定する
pages_num = 10 + 1

print(f'【検索ワード】{search_word}')

search_wordは、Google検索を行うキーワードを設定します。

pages_numは、検索上位から何件までのサイトを抽出するか指定します。

後述するURLの仕様上、表示したい件数にプラス1しないと表示サイトが1件少なくなるため、+ 1を記述しています。

print(f'【検索ワード】{search_word}')で実行結果画面に検索に使ったキーワードを表示しています。


Googleから検索結果ページを取得する


# Googleから検索結果ページを取得する
url = f'https://www.google.co.jp/search?hl=ja&num={pages_num}&q={search_word}'
request = requests.get(url)

urlの箇所でGoogleへ接続するためのURLを設定しています。

URLのパラメータであるnum=に数字を設定すると表示する検索結果ページの数が設定できます。

また、q=に検索したいキーワードを設定するとそのキーワードの結果ページが得られます。

次の行のrequests を使用すると、urlで設定したWebページの情報を取得できます。

requests.get(url) と記述することで、どのサイトからもWebページの情報を取得できますが、今回はgoogleの検索結果ページを取得しています。


検索結果ページの解析準備をする


soup = BeautifulSoup(request.text, "html.parser")

BeautifulSoupでrequestsで取得したページを解析しています。

BeautifulSoupとは、HTML や XML からデータを抽出するためのライブラリのことです。

BeautifulSoup( htmlデータ , "html.parser") と記述することで、

htmlデータ(rest.text)をプログラムで扱えるようなデータ構造に変換することができます。参考1 : Beautiful Soup 4.2.0 Doc. パーサーの指定


第一引数でhtmlのデータを渡しています。

htmlのデータは、requestsで取得したURL情報に対して、「.text」を付けることで取得できます。

また、今回のコードには記述していませんが、print(rest.text)でhtmlデータの中身を確認することができます。参考2 : requests-docs-ja.readthedocs

これを利用して、BeautifulSoupでページのどこを抽出するべきかを確認できます。



第二引数で"html.parser"を指定しています。

これは、BeautifulSoupで htmlデータを解析するために必要な引数となります。


検索結果ページを解析する


search_site_list = soup.select('div.kCrYT > a')

Googleの検索結果ページの中で、サイトのタイトルとURLが含まれる部分を抽出しています。

具体的には、ページ内で<div class="kCrYT"><a> サイトのタイトル </a></div> となっている箇所が対象となるので、その部分をそれぞれ抽出してsearch_site_listに格納しています。

イメージとしては、サイトタイトルごとに以下のようなコードが記述されているので、それをsoup.select('div.kCrYT > a')で引き抜いて、抽出したサイトごとにsearch_site_listに格納しています。

# -- 中略 --
<div class="kCrYT">
<a href="/url?q=https://www.python.jp/&amp;sa=U&amp;ved=2ahUKEwj84KDd3f_wAhUQWqwKHWSJDQUQFjAAegQIBxAB&amp;usg=AOvVaw0-xlf0dVVFo6iwHbFnLFue"><h3 class="zBAuLc">
<div class="BNeawe vvjwJb AP7Wnd">python.jp: プログラミング言語 Python
</div>
</h3>
<div class="BNeawe UPmit AP7Wnd">www.python.jp</div>
</a>
</div>
<div class="x54gtf">
</div>
# -- 以下このパターンの記述が続く --


ページ解析の続きと結果の出力


# ページ解析と結果の出力
for rank, site in zip(range(1, pages_num), search_site_list):
    try:
        site_title = site.select('h3.zBAuLc')[0].text
    except IndexError:
        site_title = site.select('img')[0]['alt']
    site_url = site['href'].replace('/url?q=', '')
    # 結果を出力する
    print(str(rank) + "位: " + site_title + ": " + site_url)

先ほどsearch_site_listで取得したデータを元に、ページ解析と結果の出力を行なっています。


サイトごとにループ処理を実行

for rank, site in zip(range(1, pages_num), search_site_list):

for文でサイトごとにデータを取り出し、解析と結果出力をおこなっています。

rankには1から順番に数字が入ります。つまりfor文が2回目なら2が入ります。

ここを利用して検索順位を表示させます。

site部分には、search_site_listから取り出したデータがforの処理の順番に入ります。

zipを使用することで、forループで複数のリストを利用できるようになります。

また、rangeを使用することで、数字のリストを簡単に作成することができます。


サイトタイトルの取得

try:
    site_title = site.select('h3.zBAuLc')[0].text
except IndexError:
    site_title = site.select('img')[0]['alt']

再び、BeautifulSoupのselectでデータ抽出を行なっています。

こちらはサイトタイトルを取得する処理です。

最初のsite.select('h3.zBAuLc')[0]では、<h3 class="zBAuLc"/>サイトタイトル/</h3>部分を抽出しています。

イメージとしては、以下のようになります。

<h3 class="zBAuLc">
<div class="BNeawe vvjwJb AP7Wnd">python.jp: プログラミング言語 Python
</div>
</h3>

site.select('h3.zBAuLc')[0]のコードのうしろに.textという記述がありますが、これはタグ内のテキスト部分を抜き出す処理となります。

site.select('h3.zBAuLc')[0].textと記述すると、上記のデータは次のようになります。

python.jp: プログラミング言語 Python

これでタイトル部分の抜き出しは完了です。

基本的に処理はこれで終了しますが、サイトのタイトル部分が動画タイトルになっていると、この処理はエラーとなります。

動画タイトルであった場合は、except IndexError:処理の次のコードが実行され、動画タイトルを取得します。


サイトURLの取得

    site_url = site['href'].replace('/url?q=', '')

site['href']と指定するとaタグ内のhref属性に含まれるデータを抽出できます。

この処理の実行例は次の通りです。

/url?q=https://www.python.jp/&amp;sa=U&amp;ved=2ahUKEwj84KDd3f_wAhUQWqwKHWSJDQUQFjAAegQIBxAB&amp;usg=AOvVaw0-xlf0dVVFo6iwHbFnLFue

これでURLが抽出できましたが、url?q=部分が邪魔です。

なのでreplaceを利用してurl?q=を削除します。

そうするとデータは次のようになります。

https://www.python.jp/&amp;sa=U&amp;ved=2ahUKEwj84KDd3f_wAhUQWqwKHWSJDQUQFjAAegQIBxAB&amp;usg=AOvVaw0-xlf0dVVFo6iwHbFnLFue


結果を出力する

# 結果を出力する
print(str(rank) + "位: " + site_title + ": " + site_url)

最後に抽出したデータを画面に出力します。

rankは数値型なので、文字列と結合できません。

そのため、str(rank)とすることでrankを文字列型に変換しています。

この出力結果をfor文の回数だけ実行すると、冒頭で紹介した実行結果となります。

実行結果
【検索ワード】python
1位: python.jp: プログラミング言語 Python: https://www.python.jp/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAAegQIBxAB&usg=AOvVaw1zWPmv7T5_TAWg3bnqmmBE
2位: Welcome to Python.org: https://www.python.org/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjABegQICRAB&usg=AOvVaw1VKreO_0TrTsBwrZLUocgi
3位: Python チュートリアル — Python 3.9.4 ドキュメント: https://docs.python.org/ja/3/tutorial/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjANegQICxAB&usg=AOvVaw1bDyksh3P8l05md7m4NnLw
4位: Python - Wikipedia - ウィキペディア: https://ja.wikipedia.org/wiki/Python&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAOegQIChAB&usg=AOvVaw2h6Ef4-6GaL_9mbBi6v5Of
5位: Pythonってどんな言語? 特徴と歴史を『独習Python』から解説 ...: https://codezine.jp/article/detail/12457&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjATegQIDBAB&usg=AOvVaw2CsNq7v9DmTsrwa8wpNE7k
6位: Python入門 〜Pythonのインストール方法やPythonを使った ...: https://www.javadrive.jp/python/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAeegQIARAB&usg=AOvVaw1eO3_CVpXxxKsCtVl9vWak
7位: Pythonのダウンロードとインストール | Python入門: https://www.javadrive.jp/python/install/index1.html&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAfegQIAhAB&usg=AOvVaw18RA3hDQzun_a1PvXcBXG6
8位: Python | プログラミングの入門なら基礎から学べるProgate[プロ ...: https://prog-8.com/courses/python&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAgegQIAxAB&usg=AOvVaw0WS_ZSGAG25fV3jTtUqiyv
9位: Python3入門編のレッスン一覧 | プログラミング学習サービス ... - Paiza: https://paiza.jp/works/python3/primer&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAhegQICBAB&usg=AOvVaw20iAjA8YLRB_xDFBrPEhBH
10位: PyQ(パイキュー) - 本気でプログラミングを学びたい人のPython ...: https://pyq.jp/&sa=U&ved=2ahUKEwi0jeHE8f_wAhX6HDQIHep7ATYQFjAiegQIBhAB&usg=AOvVaw0-cv27f91EEeVZL8-f50eF

応用編

本記事の内容を応用することで、ブログ内の記事の検索順位を一括で調査できるツールを作成することができます。

こちらはこのブログに実装されています。

検索順位チェッカー


もしよければ、参考までにお試しください。

関連記事

【Webスクレイピング入門】ヤフーニュース の見出しとURLを取得する方法
【Python】Webスクレイピングの処理速度を高速化する方法
・Webスクレイピングできること。社会のトレンドを観察するツールを作ってみた。

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信