PythonスクレイピングでGoogle検索画面情報取得
https://torahack.com/python-scraping-for-seo/
このサイトにあるように、
①検索結果上位サイトのURLを取得
②title,description等を抜き出す。
③CSVで出力、ダウンロード
ということをやりたいのですが、うまくいきません。
下記のGoogle colabファイルを作成実行したところ
csvファイルが生成されるのですが、中身は空でした。
どなたか、うまくいく方法をご存じの方はおられないでしょうか。
https://colab.research.google.com/drive/1mW3E74mPd_cIAtkbEn7sudOT4n1s3aT4
コードは下記です。
import requests
import bs4
from time import sleep
import pandas as pd
from google.colab import files
import re
# 検索したいキーワードを入力する
listKeyword = ['犬', '猫']
# 取得したい件数に合わせて数値を変更する
searchNum = str(2)
response = requests.get('https://www.google.co.jp/search?num='+searchNum+'&q=' + ' '.join(listKeyword))
response.raise_for_status()
# 取得したHTMLをパースする
soup = bs4.BeautifulSoup(response.content, "html.parser")
file_prefix = ""
for word in listKeyword:
if (file_prefix == ""):
file_prefix += str(word)
else:
file_prefix += "-" + str(word)
fileName = file_prefix+'_Top'+searchNum+'.csv'
# csvファイルのヘッダーを設定する
df = pd.DataFrame(columns=['URL','Title','Description','metakey'])
sleepCounter = 0
# 検索結果上位サイトのURLを取得する
for a in soup.select('div#search h3.r a'):
sleepCounter += 1
url = re.sub(r'/url\?q=|&sa.*', '',a.get('href'))
try:
# 取得したURLを読み込む
search = requests.get(url)
searchSoup = bs4.BeautifulSoup(search.content, "html.parser")
# タイトルの取得
titleList = []
for a in searchSoup.select('title'):
titleList.append(a.text)
title=''
for index,item in enumerate(titleList):
if index==0:
title = item
else:
title = title + ', ' +item
# ディスクリプションの取得
descriptionList = []
for a in searchSoup.select('meta[name="description"]'):
descriptionList.append(a.get('content'))
description='No data'
for index,item in enumerate(descriptionList):
if index==0:
description = item
else:
description = description + ', ' +item
# キーワードの取得
keywordList = []
for a in searchSoup.select('meta[name="keywords"]'):
keywordList.append(a.get('content'))
keywords = 'No data'
for index,item in enumerate(keywordList):
if index==0:
keywords = item
else:
keywords = keyword + ', ' +item
except: #例外処理:サイトを読み込めなかったときにする処理
print('Failed to read web site.')
# 取得したURL、タイトル、ディスクリプション、キーワードを追加する
outputRow = [url,title,description,keywords]
s = pd.Series(outputRow, index=['URL','Title','Description','metakey'])
df = df.append(s, ignore_index=True)
# 10件以上検索する場合、秒間リクエスト数の制限を守るため、10件ごとに10秒の待機時間を設ける
if sleepCounter > 10:
sleep(10)
sleepCounter = 0
# csvに出力する
df.to_csv(fileName, index=False)
# csvをダウンロードする
files.download(fileName)