IT

合法にGoogle検索結果を取得する【PythonとCustom Search API】

はらじょ

こんにちは、はらじょです!
この記事では、合法にGoogle検索結果を取得する方法を紹介します。

本記事でできるようになること

Google検索結果の取得

キーワードのGoogle検索結果(検索順位)を取得するプログラムを実装できるようになります。
使用ツールとしては、Google Custom Search APIとpythonです。
Windowsで説明しますが、Macでも適宜読み変えてもらえば問題なく行えます。

 

Google Custom Search API以外の利用は違法になることも

Google検索結果を取得するツールやライブラリはたくさんあります。
Pythonのライブラリで有名なのはBeautifulSoupやSeleniumですが、Googleの規約上問題がありそうです。

こちらの記事に詳しくまとめてありますので、これからWEBスクレイピングを行おうという人は目を通しておいたほうが良いです。
【Python】違法にならずにGoogle検索結果をPythonで取得する時に考えること-前編

上記の理由から、本記事ではGoogle Custom Search APIを用いた検索結果取得を解説します。
Googleが公式に提供しているAPIですので、違反にならない安心の方法です。

無料枠だと1日あたりのAPI呼び出しが100回までと制限されますが、趣味程度にやる分にはOKかと思います。

 

WEBスクレイピングを学べる

クラウドワークスなどでも「WEBスクレイピング」の案件は増えているようです。
本記事の内容を行えば、その土台知識が身に付きます。

「言葉だけ知っている」のと、「実際にやったことがある」のとでは、天と地の差がありますからね。

「Googleで検索すれば、ほとんどの情報が手に入る時代。「1歩先のWEB検索」って感じで学んでいて楽しかったです。」

 

それでは、「Google検索結果取得Pythonコード」の具体的な作成手順を示していきます。

STEP①:Google Custom Search APIでの作業
STEP②:Pythonの実行

わずか2STEPです。順に解説していきます。

 

STEP①:Google Custom Search APIでの作業

キーを取得

下の記事を参考に、

✓Google Custom Search APIのAPIキー
✓Custom Search EngineのエンジンID

を取得します。
【2022年UI変更】GOOGLEの検索結果をAPIで取得する方法 ~簡単4ステップ・まとめ付き~

大まかな流れ

① APIの取得
Google Cloud Platformからプロジェクトを作成
→Google Custom Search APIのAPIキーを取得(メモしておくこと)

② APIの有効化
Google Cloud PlatformからCustom Search APIを有効化

③ Custom Search Engineの取得
利用可能な検索エンジンを作成
→検索エンジンIDを取得(メモしておくこと)

 

STEP②:pythonの実行

Google Custom Search APIの手続きは終えましたか?

自分用の2つのキーが取得できているはずです。
✓Google Custom Search APIのAPIキー
✓Custom Search EngineのエンジンID

さあ、それではPythonのプログラムを組んでいきましょう!

Python環境の構築

Pythonの実行環境がPCにない方は構築しましょう。

コマンドプロンプト(Macの方はターミナル)で「python」と打ち込んで、下記のように >>> がでてくればpython実行可能な状態です。次の Google API Client Libraries(Python)のインストール に進みましょう。

Pythonの実行環境がない方は、Pythonのダウンロードとインストールを見ながら構築するか、「python インストール」で検索して参考サイト探してください。
一応Pythonの公式ページのリンクはこちらです。

 

Google API Client Libraries(Python)のインストール

Google提供のライブラリです。
コマンドプロンプト(Macの方はターミナル)で下のコマンドを実行し、インストールします。

$ pip install --upgrade google-api-python-client

 

サンプルコード

下記のQiitaの記事を参考に、コードを組み立てました。
Pythonコード以外にも、「APIの無料枠と回数のリセットタイミング」や、「APIで取得した結果と普通にWebで検索した結果が微妙に違う」ことなど詳しく考察してあります。

Custom Search APIを使ってGoogle検索結果を取得する

下記がサンプルコードです。
上記Qiitaサイトを参考にさせてもらっています。

一部コードを書き加えております。

私のPCで実行したときに文字コードでエラーになったため付け加えた。
jsonstr = jsonstr.encode('cp932', 'ignore')
jsonstr = jsonstr.decode('cp932')

 

コマンドラインに、検索順位上位から{searchnum}位のサイトリンクを吐き出すようにした。
searchnum = 5 #検索順位の何番目まで取得したいか
save_response_dir = os.path.join(DATA_DIR, 'response')
today = datetime.datetime.today().strftime("%Y%m%d")
with open(os.path.join(save_response_dir, 'response_' + today + '.json')) as f:
json=json.load(f)
for i in range(searchnum):
print(json["response"][0]["items"][i]["link"])

コードを実行させると、下のような実行結果を得ることができます。

◇検索キーワード
エンジニア おすすめ資格

◇実行結果
https://itpropartners.com/blog/11621/
https://www.seraku.co.jp/tectec-note/industry/se_certification/
https://www.fenet.jp/beginner/column/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2/166/

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import datetime
import json

from time import sleep
from googleapiclient.discovery import build

GOOGLE_API_KEY = "Google Custom Search APIキーを入力"
CUSTOM_SEARCH_ENGINE_ID = "検索エンジンIDを入力"

DATA_DIR = 'data'

def makeDir(path):
if not os.path.isdir(path):
os.mkdir(path)

def getSearchResponse(keyword):
today = datetime.datetime.today().strftime("%Y%m%d")
timestamp = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")

makeDir(DATA_DIR)

service = build("customsearch", "v1", developerKey=GOOGLE_API_KEY)

page_limit = 2
start_index = 1
response = []
for n_page in range(0, page_limit):
try:
sleep(1)
response.append(service.cse().list(
q=keyword,
cx=CUSTOM_SEARCH_ENGINE_ID,
lr='lang_ja',
num=10,
start=start_index
).execute())
start_index = response[n_page].get("queries").get("nextPage")[0].get("startIndex")
except Exception as e:
print(e)
break

# レスポンスをjson形式で保存
save_response_dir = os.path.join(DATA_DIR, 'response')
makeDir(save_response_dir)
out = {'snapshot_ymd': today, 'snapshot_timestamp': timestamp, 'response': []}
out['response'] = response
jsonstr = json.dumps(out, ensure_ascii=False)
jsonstr = jsonstr.encode('cp932', 'ignore')
jsonstr = jsonstr.decode('cp932')
with open(os.path.join(save_response_dir, 'response_' + today + '.json'), mode='w') as response_file:
response_file.write(jsonstr)

if __name__ == '__main__':

target_keyword = '検索したいキーワードを入力'

getSearchResponse(target_keyword)

searchnum = 3 #検索順位の何番目まで取得したいか
save_response_dir = os.path.join(DATA_DIR, 'response')
today = datetime.datetime.today().strftime("%Y%m%d")
with open(os.path.join(save_response_dir, 'response_' + today + '.json')) as f:
json=json.load(f)
for i in range(searchnum):
print(json["response"][0]["items"][i]["link"])


 

ABOUT ME
はらじょ
はらじょ
ITエンジニア
記事URLをコピーしました