web-dev-qa-db-ja.com

カスタム検索を使用してPythonでプログラム的にGoogleを検索する

Pygoogle pythonモジュールを使用したコードスニペットがあり、プログラムでgoogleのいくつかの用語を簡単に検索できます。

 g = pygoogle(search_term)
 g.pages = 1
 results = g.get_urls()[0:10]

残念ながら、これは残念ながら廃止され、Googleカスタム検索と呼ばれるものに置き換えられました。 SOの他の関連する質問を見ましたが、使用できるものが見つかりませんでした。 2つの質問があります。

1)Googleカスタム検索を使用すると、上記の3行で行っていることを正確に実行できますか?

2)「はい」の場合-上記のことを正確に行うためのサンプルコードはどこにありますか?いいえの場合、pygoogleを使用して行ったことを行う代替手段は何ですか?

40
user2399453

これを行うことは可能です。セットアップは非常に単純ではありませんが、最終的な結果は、数行のコードでpythonからWeb全体を検索できることです。

合計で3つの主要なステップがあります。

最初のステップ:Google APIキーを取得する

pygoogle のページの状態:

残念ながら、GoogleはSOAP AP​​Iの検索をサポートしなくなり、新しいライセンスキーも提供しません。一言で言えば、PyGoogleはこの時点でほとんど死んでいます。

代わりにAJAX AP​​Iを使用できます。サンプルコードについては、こちらをご覧ください: http://dcortesi.com/2008/05/28/google-ajax-search-api-example-python-code/

...しかし、実際にはAJAX AP​​Iも使用できません。 Google APIキーを取得する必要があります。 https://developers.google.com/api-client-library/python/guide/aaa_apikeys 簡単な実験的な使用のために、「サーバーキー」をお勧めします。

2番目のステップ:カスタム検索エンジンをセットアップして、ウェブ全体を検索できるようにします

実際、古いAPIは使用できません。利用可能な最高の新しいAPIはカスタム検索です。特定のドメイン内での検索のみをサポートしているようですが、 this SO answer を実行すると、ウェブ全体を検索できます。

  1. Googleカスタム検索のホームページ( http://www.google.com/cse/ )から、[カスタム検索エンジンの作成]をクリックします。
  2. 検索エンジンの名前と説明を入力します。
  3. [検索エンジンの定義]の[検索するサイト]ボックスに、少なくとも1つの有効なURLを入力します(現時点では、この画面を抜けるにはwww.anyurl.comを入力してください。これについては後で説明します)。
  4. 目的のCSEエディションを選択し、利用規約に同意して、[次へ]をクリックします。必要なレイアウトオプションを選択し、[次へ]をクリックします。
  5. [次のステップ]セクションの下にあるリンクのいずれかをクリックして、コントロールパネルに移動します。
  6. 左側のメニューの[コントロールパネル]で、[基本]をクリックします。
  7. [検索設定]セクションで、[ウェブ全体を検索するが、含まれるサイトを強調する]を選択します。
  8. [変更を保存]をクリックします。
  9. 左側のメニューの[コントロールパネル]で、[サイト]をクリックします。
  10. 初期設定プロセス中に入力したサイトを削除します。

このアプローチはGoogleでも推奨されています: https://support.google.com/customsearch/answer/263104

3番目のステップ:Python用Google APIクライアントをインストールする

pip install google-api-python-client、詳細はこちら:

4番目のステップ(ボーナス):検索を行う

したがって、これを設定した後、いくつかの場所からコードサンプルをたどることができます。

そしてこれで終わる:

from googleapiclient.discovery import build
import pprint

my_api_key = "Google API key"
my_cse_id = "Custom Search Engine ID"

def google_search(search_term, api_key, cse_id, **kwargs):
    service = build("customsearch", "v1", developerKey=api_key)
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
    return res['items']

results = google_search(
    'stackoverflow site:en.wikipedia.org', my_api_key, my_cse_id, num=10)
for result in results:
    pprint.pprint(result)

少し調整した後、スニペットとまったく同じように動作する関数を作成できますが、ここではこの手順をスキップします。

84
mbdevpl