Goal:pythonを用いて検索結果一覧をみたい
目的
SEO関連の調査を行うにあたり、検索結果の一覧が欲しいと考えました。
https://www.google.com/search?num=2&q=〇〇
のnum=を書き換えて一覧を取得する方法でもいいかな、と思いましたが、
毎回するのは不格好で、かつ、requestsとbs4の勉強もかねて作ってみました。
実行は
***.py "keyword"
で実行してください。
例えば、バターナイフを調べたい場合は
***.py バターナイフ
となります。
複数キーワードを設定したい場合は、keyword1+keywors2+...
と引数を設定すると実行できます。
成果物
# -*- coding: utf-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
import csv
# 項目数を増やす場合は、num=100 など変更します
google = 'https://www.google.com/search?num=10&q='
re = requests.get(google+ ''.join(sys.argv[1:]))
soup = BeautifulSoup(re.text, "lxml")
# soupの具材をみてどこから探すか検討。google検索の場合、下記でうまくいきます。
elems = soup.select(".r a")
for elem in elems:
#text抽出
txtelem = elem.getText()
#url抽出 余分な接頭辞があるので空白に置き換えます。
repelem = elem.get('href').replace('/url?q=','')
#確認用に出力しています。不要であれば削除してください。
print('{} ,{}'.format(txtelem, repelem))
data = [[txtelem, repelem]]
with open('googlesearch.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerows(data)
同一フォルダ内にgooglesearch.csvが作成、実行ごとに結果が取得されます。
都度csvを上書きをしたい場合は
a
を w
に変えるだけで本来はいいのですが、for で回しているので一行ごとに上書きされてしまいます。
そこで、実行時に前回の内容を削除するコマンドを実行します。
for の前に
with open('googlesearch.csv', 'w', newline='') as f:
f.write("")
を追記するとうまくできます。
結果を確認
Qiita ,https://qiita.com/&sa=U&ved=0ahUKEwjv-sT0977eAhXNa94KHVMHCLcQFggUMAA&usg=AOvVaw0y_sHe_tLOSNzkcjQHvct_
Qiita (キータ) 公式 (@Qiita) | Twitter ,https://twitter.com/qiita&sa=U&ved=0ahUKEwjv-sT0977eAhXNa94KHVMHCLcQFggaMAE&usg=AOvVaw1qhHoSKmnAa69GduySbEpl
....
検索結果は、下記の通りです。
なお、soupの内容からコードを作成しており、オーガニックな結果のみ(広告・ニュースを除く)取得するようにしています。
広告・ニュースなど、すべての結果を取得する場合、soup
の中身をみて、soup.select()
の箇所を変更してみるとうまくいくと思います。
課題は、日本のデータはこれで取得できますが、海外の場合はどうしたらいいのいか、です。
追記(2018年11月8日)
課題に対して、mareku さんよりコメント欄に以下の記述がありました。
URLにパラメータを追加すれば、海外のGoogle検索結果を見れますよ。
gl 国を指定する。
米国ならgl=us
国コードはISO 3166 - Wikipediaのalpha-2が使用されています。
hl 言語を指定する。
英語なら hl=en
言語コードはISO 639-1 - Wikipediaが使用されています。
ですべてを含むと https://www.google.com/search?&gl=us&hl=en&num=10&q=
ありがとうございました!!!