PythonでGoogle検索の検索順位チェック用ツールを作ってみた

みなさまおはこんばんにちは、せなです

今回はGoogle検索の検索順位を確認するために簡単なツールを作ったので公開したいと思います

始めに

※このプログラムは改良途中です
xlsxファイルの「A2」にURLを記述して使用してください(空ファイルだと崩れます)
今後はKivyとか使ってインターフェースから操作できるようにしたりとか、グラフで確認できるようにしたりとかする予定です

私が個人的に使おうと思って作っているので、使い方とかはユーザーフレンドリーではないと思います
参考程度に見てもらえると嬉しいです

開発環境

Windows10
Python3.7
bs4
openpyxl

openpyxlの使い方は下の記事を参考にどうぞ

リンク:openpyxlを使用してPythonでExcelファイルを操作する

ソースコード

始めにソースコードを載せておきます
後ほど簡単に説明をさせていただきます

import bs4
import requests
import json
import re
import openpyxl
import datetime
wb = openpyxl.load_workbook('ranking.xlsx')
ws = wb['Sheet']
ini_column = ws.max_column + 1  # Initial column+1
# Google Index 50 Ranking Get or Not Rank
def search_index(url, keywords):
    for key_word in keywords:
        search_url = 'https://www.google.co.jp/search?hl=ja&num=50&q=' + key_word
        google_res = requests.get(search_url)
        google_res.raise_for_status()  # 200チェック
        google_bs4 = bs4.BeautifulSoup(google_res.text, 'html.parser')
        prototype_urls= [i.parent.get("href") for i in google_bs4.findAll('div', class_='BNeawe vvjwJb AP7Wnd')]
        urls = [re.sub(r'/url\?q=|&sa.*', '', x) for x in prototype_urls]
        if urls.count(url) != 0:
            return urls.index(url)
        else:
            return 'Not Rank'
# Excel URL & KeyWord & Ranking Added
def excel_url_add(url, keyword, rank):
    for word in keyword:
        if excel_url_search(url, word):
            local_row = ws.max_row + 1
            ws['A' + str(local_row)] = url
            ws['B' + str(local_row)] = word
        rank_row = excel_keyword_position(word)
        ws[ws.cell(row=rank_row, column=ini_column).coordinate] = rank
# Excel Date Added
def excel_date_add():
    ws[ws.cell(row=1, column=ini_column).coordinate] = datetime.date.today()
# Excel URL KeyWord Search Hit=NewURL & KeyWord Added
def excel_url_search(url, keyword):
    url_list = [cell.value for cell in ws['A']]
    keyword_list = [cell.value for cell in ws['B']]
    if url_list.count(url) != 0 and keyword_list.count(keyword) != 0:  # url or keyword Not List count then True
        return False
    else:
        return True
# Excel Keyword Position Get
def excel_keyword_position(keyword):
    keyword_list = [cell.value for cell in ws['B']]
    keyword_row = keyword_list.index(keyword) + 1
    return keyword_row
def main():
    with open('keyword.json', 'r', encoding='utf-8_sig') as file:
        keyword_json = json.load(file)
        excel_date_add()
        for key, value in keyword_json.items():
            url_index = search_index(key, value)
            excel_url_add(key, value, url_index)
    wb.save('ranking.xlsx')
if __name__ == '__main__':
    main()

ソースコードを簡単に解説

search_index()

search_url = 'https://www.google.co.jp/search?hl=ja&num=50&q=' + key_word
google_res = requests.get(search_url)
google_res.raise_for_status()

見ての通り50位以内のgoogle検索情報を取得してます
raise_for_status()はレスポンスが正常かのチェックですね

google_bs4 = bs4.BeautifulSoup(google_res.text, 'html.parser')

bs4.BeautifulSoup()でgoogle検索結果から取得したgoogle_res.textのhtml情報を取得しています
それをgoogle_bs4に代入しています

prototype_urls = [i.parent.get("href") for i in google_bs4.findAll('div', class_='BNeawe vvjwJb P7Wnd')]

google_bs4.findAll()でdivの中からclassに指定したものと合致するのを「i.parent.get(“href”)」でurl情報を取得します

urls = [re.sub(r'/url\?q=|&sa.*', '', x) for x in prototype_urls]

取得したurl情報を正規化したのちに情報を取得する

if urls.count(url) != 0:

これは見ての通りです
google検索に自分のurlがあったかどうかですね

excel_url_add()

if excel_url_search(url, word):

後述する「excel_url_search()」の結果から判定しています
ここでTrueが返却されていればExcelに登録されていないと判断して新規追加しています

rank_row = excel_keyword_position(word)

検索順位をどこのセル行に追加するのかを返却してくれます

ws[ws.cell(row=rank_row, column=ini_column).coordinate] = rank

見ての通り、検索順位をセルに追加しています
ini_columnはセルに何かを追加する前の最大列+1です

excel_date_add()

ws[ws.cell(row=1, column=ini_column).coordinate] = datetime.date.today()

今日の日付をセルに追加しています

excel_url_search()

url_list = [cell.value for cell in ws['A']]
keyword_list = [cell.value for cell in ws['B']]

A列にあるurlリストをすべて取得しています(keywordも同じです)

if url_list.count(url) != 0 and keyword_list.count(keyword) != 0:

url_listに同じurlがありkeyword_listにも同じkeywordがあるならFalseを返却します

excel_keyword_position()

keyword_list = [cell.value for cell in ws['B']]
keyword_row = keyword_list.index(keyword) + 1

B列のキーワードをリストで取り出し、「.index()」でそのキーワードに行番号を取得する
(同じキーワードが存在するとうまく動かない)

最後に

前半コード公開・後半ザックリとコードの解説を行いました

検索順位の取得とかはわりと簡単にできたんですが、Excelのセル指定とかが鬼門で結構時間取られました…

おそらく今後別の記事で、Kivyとか追加した後のことを投稿すると思いますので、その時にはご覧いただけると幸いです

ここまで読んで下さり、ありがとうございました
ではでは~