Google Custom Search APIでgoogleの検索結果データを取得したい。
ここやここをパク、参考にやってみたところ、前者であるjavascriptを使うやり方ではうまくいかず、後者のpythonを使うやり方ではうまくいきました。
問題:前者でうまくいくようにしたい
前者(JavaScript)
javascript
1 const API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 2 const CSE_ID = 'xxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx'; 3 let keywords = '検索ワード'; 4 let cse_url = 'https://www.googleapis.com/customsearch/v1?key=' + API_KEY + '&cx=' + CSE_ID + '&q=' + keywords; 5 const request = new XMLHttpRequest(); 6 request.open('GET', cse_url); 7 request.onreadystatechange = function () { 8 if (request.readyState != 4) { 9 // リクエスト中 10 } else if (request.status != 200) { 11 // 失敗 12 console.log('Damn it!'); 13 } else { 14 // 取得成功 15 const result1 = request.responseText; 16 console.log(result1); 17 } 18 }; 19 request.send();
をローカル開発環境の構築 [macOS編]の上で、検索ワードの文字列をkeywordsに代入し動作させると定数result1に
json
1{ 2 "kind": "customsearch#search", 3 "url": { 4 "type": "application/json", 5 "template": "https://www.googleapis.com/customsearch/v1?q=・・・(略)・・・=json" 6 }, 7 "queries": { 8 "request": [ 9 { 10 "count": 10, 11 "startIndex": 1, 12 "inputEncoding": "utf8", 13 "outputEncoding": "utf8", 14 "safe": "off", 15 "cx": "xxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx" 16 } 17 ] 18 }, 19 "searchInformation": { 20 "searchTime": 0.011195, 21 "formattedSearchTime": "0.01", 22 "totalResults": "0", 23 "formattedTotalResults": "0" 24 } 25}
と入っていました。五行目"template"のURLを辿ると
{ "error": { "code": 403, "message": "The request is missing a valid API key.", "errors": [ { "message": "The request is missing a valid API key.", "domain": "global", "reason": "forbidden" } ], "status": "PERMISSION_DENIED" } }
と表示されます。
後者(Python)
Python
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import os 5import datetime 6import json 7 8from time import sleep 9from googleapiclient.discovery import build 10 11GOOGLE_API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 12CUSTOM_SEARCH_ENGINE_ID = "xxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxx" 13 14DATA_DIR = 'data' 15 16def makeDir(path): 17 if not os.path.isdir(path): 18 os.mkdir(path) 19 20def getSearchResponse(keyword): 21 today = datetime.datetime.today().strftime("%Y%m%d") 22 timestamp = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S") 23 24 makeDir(DATA_DIR) 25 26 service = build("customsearch", "v1", developerKey=GOOGLE_API_KEY) 27 28 page_limit = 10 29 start_index = 1 30 response = [] 31 for n_page in range(0, page_limit): 32 try: 33 sleep(1) 34 response.append(service.cse().list( 35 q=keyword, 36 cx=CUSTOM_SEARCH_ENGINE_ID, 37 lr='lang_ja', 38 num=10, 39 start=start_index 40 ).execute()) 41 start_index = response[n_page].get("queries").get("nextPage")[0].get("startIndex") 42 except Exception as e: 43 print(e) 44 break 45 46 # レスポンスをjson形式で保存 47 save_response_dir = os.path.join(DATA_DIR, 'response') 48 makeDir(save_response_dir) 49 out = {'snapshot_ymd': today, 'snapshot_timestamp': timestamp, 'response': []} 50 out['response'] = response 51 jsonstr = json.dumps(out, ensure_ascii=False) 52 with open(os.path.join(save_response_dir, 'response_' + today + '.json'), mode='w') as response_file: 53 response_file.write(jsonstr) 54 55if __name__ == '__main__': 56 57 target_keyword = 'ダイエット' 58 59 getSearchResponse(target_keyword) 60
一方でこちらは参考にしたページの通りのJSONデータが得られました。
詰み
例えばここに同じ名前のメッセージが問われたりしていますがなんだか理解まで辿り着けません。
お願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/17 09:12