****.py "keyword" でGoogle検索結果のタイトルとURLをcsvに書き込む


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を上書きをしたい場合は

aw に変えるだけで本来はいいのですが、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=

ありがとうございました!!!