【スクレイピングでキーワード選定効率化】検索ボリューム・競合調査結果を一括出力【Python】
![](https://senriweb.com/wp-content/uploads/2021/10/python-spreadsheet.png)
SEO対策の1つであるキーワード選定をスクレイピングで効率化できないかと思い、やってみたところ意外と簡単にできたのでその手法を公開します。
前提
上位表示を狙うためにボリュームの大きさを調べたり競合サイト数のリサーチを行うと思います。
例えば、○○の特化サイトの場合、検索のボリュームの大きい「○○ △△ ××」というキーワードで実際に検索し、上位に競合が多く出ないか(裏返すと「コンテンツ内容が薄いサイトが上位に出現するか」)を調べます。
今回はその過程を効率化する方法について紹介します。
【上位表示を狙いやすいキーワードの特徴】
- 検索ボリューム(月間検索数)が大きい
- 競合が少ない
これをプログラムに落とし込みます
できること
指定した文字列を含むURLのサイトが上位に表示される際のキーワード、検索ボリューム、そのサイトの順位、タイトル、URLをスプレッドシートに出力
![](https://senriweb.com/wp-content/uploads/2021/10/image-17.png)
下準備
ラッコキーワードから候補をコピー
ラッコキーワードでメインのキーワードを入力し検索
![](https://related-keywords.com/img/rakko_keyword_ogp.png)
検索結果画面右上の全キーワードコピーをクリック
![](https://senriweb.com/wp-content/uploads/2021/10/image-1024x383.png)
キーワードプランナーで検索ボリュームを取得
Google広告を開き検索窓にキーワードプランナーと入力し選択(この辺りはUIが変わりやすいので手順は参考程度に…)
(※未登録の場合はアカウント作成からです。Gmailアドレスが必要。)
![](https://senriweb.com/wp-content/uploads/2021/10/image-11-1024x242.png)
キーワードプランナーの開始画面で「検索のボリュームと予測データを確認する」を選択
![](https://senriweb.com/wp-content/uploads/2021/10/image-1-1024x454.png)
先ほどコピーしたキーワードを張り付けて「開始する」をクリック
![](https://senriweb.com/wp-content/uploads/2021/10/image-2-1024x605.png)
右上のダウンロードのマーク「⇩」をクリック
![](https://senriweb.com/wp-content/uploads/2021/10/image-3.png)
過去のプラン指標の「Googleスプレッドシート」を選択
![](https://senriweb.com/wp-content/uploads/2021/10/image-7.png)
ファイル名とフォルダを指定してダウンロードボタンをクリック
![](https://senriweb.com/wp-content/uploads/2021/10/image-5.png)
「スプレッドシートを開く」をクリックするとスプレッドシートが開く
![](https://senriweb.com/wp-content/uploads/2021/10/image-6.png)
シート名を変更
入力用シートの名前を”in”、出力用を”out”としておく。
![](https://senriweb.com/wp-content/uploads/2021/10/image-8.png)
![](https://senriweb.com/wp-content/uploads/2021/10/image-10.png)
スクレイピング
Google Colaboratoryを開いて新しいノートブックを作成し下記コードを貼り付け
import requests
from bs4 import BeautifulSoup
from time import sleep
from google.colab import auth
from google.auth import default
import gspread
# シート読み込み
auth.authenticate_user()
creds, _ = default()
gc = gspread.authorize(creds)
ss_url = 'ここにスプレッドシートのURLを記載してください'
workbook = gc.open_by_url(ss_url)
sheet_in = workbook.worksheet("in")
sheet_out = workbook.worksheet("out")
# 行範囲を指定
start = 6
end = 100
# 抽出用URLを指定
target_url = 'https://detail.chiebukuro.yahoo.co.jp/'
for i in range(start, end + 1):
# Google検索するキーワードを設定
search_word = sheet_in.cell(i,1).value
# キーワードのボリューム
if(sheet_in.cell(i,4).value != ""):
volume = int(float(sheet_in.cell(i,4).value))
else:
volume = 0
# 検索順位10位まで調べる
rank_max = 10
pages_num = rank_max + 1
print(f'{i} {search_word}')
# ヘッダー出力
if(sheet_out.cell(1,1).value == ""):
sheet_out.append_row(["キーワード", "ボリューム", "順位", "タイトル", "URL"])
# 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_url = site['href'].replace('/url?q=', '').split('&sa=U')
# 結果出力(条件:指定URLが含まれる かつ ボリューム≧50)
if((target_url in site_url[0]) and ( volume >= 50 )):
# スプレッドシートに出力
sheet_out.append_row([search_word, volume, rank, site_title, site_url[0]])
# 20秒待機
sleep(20)
![](https://senriweb.com/wp-content/uploads/2021/10/image-12.png)
※最初の方にあるss_url = 'ここにスプレッドシートのURLを記載してください'
の部分は保存したスプレッドシートのURLに書き換えてください。
※行範囲はスプレッドシートのキーワードが入っている行の番号を指定してください。
※抽出用URLに抽出したいサイトのURLを指定してください。(お悩み相談系のサイトが上位表示されることを条件とすることで「コンテンツの充実した競合サイトが少ない」キーワードを探し出すことができます。)
【お悩み相談系サイト】
- Yahoo!知恵袋:
https://detail.chiebukuro.yahoo.co.jp/
- 教えて!goo:
https://oshiete.goo.ne.jp/
- OKWAVE(オウケイウェイヴ):
https://okwave.jp/
- teratail(テラテイル):
https://teratail.com/
※待機時間も問題無いよう設定していますが実行は自己責任でお願いします。スクレイピングのルールがまとまっている記事も参考にどうぞ)
実行ボタン(▶)をクリックすると認証を求められるのでURLリンクをクリックして認証する。
![](https://senriweb.com/wp-content/uploads/2021/10/image-14.png)
![](https://senriweb.com/wp-content/uploads/2021/10/image-15.png)
ログイン後、認証コードをコピーしEnter verification code:
の欄に入力しEnterを押すと実行される
スプレッドシートの”out”シートに条件に合ったキーワードが抽出されていく
![](https://senriweb.com/wp-content/uploads/2021/10/image-16-1024x144.png)
最後に
今回のようなスクレイピングはUdemyで勉強するだけでも簡単に習得できるのでおすすめです。
PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】
Pythonによるビジネスに役立つWebスクレイピング(BeautifulSoup、Selenium、Requests)
スクレイピングで効率的にデータを収集・活用する技術を身に付けておくことで、思いついたときに自力で(ググりまくるが)業務を効率化できます。
参考サイト
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9R29vZ2xlJTIwQ29sYWIlRTMlODElOEIlRTMlODIlODlHb29nbGUlMjAlRTMlODIlQjklRTMlODMlOTclRTMlODMlQUMlRTMlODMlODMlRTMlODMlODklRTMlODIlQjclRTMlODMlQkMlRTMlODMlODglRTMlODIlOTIlRTYlODklQjElRTMlODElODYlRTMlODElQTglRTMlODElOEQlRTMlODElQUUlRTMlODIlQjUlRTMlODMlQjMlRTMlODMlOTclRTMlODMlQUIlRTMlODIlQjMlRTMlODMlQkMlRTMlODMlODklRTMlODElQkUlRTMlODElQTglRTMlODIlODEmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTIwNWExZmEyZTQ0YzhiZTlmMjhhMDE5N2YxZjhiNGJm&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBzYWZhJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz05ODFhNWQ5ODc4ZDExZDVmZWVjYzc0MDQyNmVmMjFlNA&blend-x=142&blend-y=486&blend-mode=normal&s=e44460dca650bd1c0f5d3241c979d362)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9R29vZ2xlQ29sYWJvcmF0b3J5JUUzJTgxJThCJUUzJTgyJTg5JUUzJTgyJUI5JUUzJTgzJTk3JUUzJTgzJUFDJUUzJTgzJTgzJUUzJTgzJTg5JUUzJTgyJUI3JUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgyJTkyJUU2JTkzJThEJUU0JUJEJTlDJUUzJTgxJTk5JUUzJTgyJThCJUUzJTgxJTlGJUUzJTgyJTgxJUUzJTgxJUFFJUU4JUFBJThEJUU4JUE4JUJDJUUzJTgxJThDJUU5JTgwJTlBJUUzJTgyJTg5JUUzJTgxJUFBJUUzJTgxJThGJUUzJTgxJUFBJUUzJTgxJUEzJUUzJTgxJTlGJUU4JUE5JUIxJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1mY2E3ZDZkYTE3NGFjZDg3MzVmMTc5NjI4NjQzZTkxYg&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB0b3JhYWEmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWJkZjJlZDY2OTMzMjQyOWVkOGZhZjBjZmUyNDdiMjcz&blend-x=142&blend-y=486&blend-mode=normal&s=51c93a4f5497704f870dbf573cb6002c)
※2022/07/18訂正内容:
from oauth2client.client import GoogleCredentials
をfrom google.auth import default
に変更
gc = gspread.authorize(GoogleCredentials.get_application_default())
をcreds, _ = default()
gc = gspread.authorize(creds)
に変更しました。