æ©æ¢°åŠç¿çšã®ç»åã1000æãªãŒããŒã§éãããã
ååã¯Bingã®ç»åæ€çŽ¢APIã䜿ã£ãŠã¿ãŸããããããããªæ€çŽ¢ããŒã¯ãŒãã§ååŸã§ããç»åã¯Googleã®æ¹ãå€ããïŒïŒïŒãªæ°ãããã®ã§ããã¡ããGoogleã§ãAPIãå©ããããã«ããŠã¿ãŸããã
ãšããããã§ä»åã¯GoogleãæäŸããæ€çŽ¢ãšã³ãžã³ã®APIãGoogle Custom Search APIã ã䜿ã£ãŠç»ååéããŠã¿ãŸãã䜿çšèšèªã¯Python3ã§ãã
Google Custom Search APIã¯ãã¡ãã«ãã¹ãããŒã«ããããŸããïŒâ» "cx"ãã©ã¡ãŒã¿ã«ãåŸè¿°ãããã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³IDããå¿ èŠã«ãªããŸãïŒ
äžçªæåã«ãªããæžããŠããŸããŸãããgoogle APIã§ç»åãåéããã®ã¯ããªãã€ã±ãŠãŸãããBingã®APIã䜿ã£ãã»ãããã£ãšãã·ãªæãã§ãïŒè©³çްã¯åŸè¿°ïŒã
APIãå©ããŠç»åååŸãããŸã§ã®æµã
- Google Developers Console ããAPIããŒãååŸ
- ãã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³ããäœæãkeyãååŸ
- google-custom-search-api-pythonãã€ã³ã¹ããŒã«
- ã³ãŒããæžããŠAPIãå©ã
ãšããæµãã§ããïŒå®éã¯1,2,3ã®é çªã¯ã©ãã§ãè¯ãïŒ
1. Google Developers Console ããAPIããŒãååŸ
Googleã®ã«ãŠã³ããæã£ãŠããåæã§ãGoogle Developer Consoleã«ã¢ã¯ã»ã¹ããŸãã
ããã®ä»ã®äžè¬çãªAPIãã«ãããCustom Search APIããéžæ
å³åŽã«ããããããžã§ã¯ããäœæãã§ãé©åœãªååãæå®ããŠãããžã§ã¯ããäœæããã
ã€ãã§ã«ãæå¹ã«ããããã¯ãªãã¯ããŠãCustom Search APIãæå¹åããã
ãã®åŸãå·Šã¡ãã¥ãŒã«ãããèªèšŒæ
å ±ããã¯ãªãã¯ããŠããèªèšŒæ
å ±ãäœæã>ãAPIããŒããéžæ
åºãŠããããŒãããããå¿
èŠã«ãªãAPI keyã«ãªãã®ã§ã¡ã¢ã
â»äžèŠãããããŸããããå³äžã®ãç¡æãã©ã€ã¢ã«ã«ç»é²ããå¿ èŠããã§ããã°é©å®ç»é²ããŠã¿ãŠãã ããïŒâ詳ããæäœå¿ããŸããorzïŒ
2. ãã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³ããäœæãIDãååŸ
Googleã® Custom Search APIãåããããã«ã¯ãäžèšã®API keyã ãã§ãªããã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³ããªããã®ãäœæããã®IDãå¿ èŠã«ãªããŸãã
ãã¡ãã«ã¢ã¯ã»ã¹ããIDãäœæããŠãã ããã
詳ããäœãæ¹ã¯ä»¥äžã®ããã°ãããããããã®ã§åç §
ãæ€çŽ¢ãšã³ãžã³IDããååŸã§ããã°okã§ãã
3. google-custom-search-api-pythonãã€ã³ã¹ããŒã«
ä»åã¯APIãPythonã§åãããããå
¬åŒã®Pythonã¢ãžã¥ãŒã« ãã€ã³ã¹ããŒã«ããŠäœ¿ããŸãã
èªåã§ã¹ã¯ã©ããããé¢åãªã³ãŒããããããæžããªããŠããç°¡åã«APIãå©ãã䟿å©ãªé¢æ°ãå©çšã§ããããã«ãªããŸããã³ãã³ãäžçºã§ã€ã³ã¹ããŒã«ã§ããŸãã
$ pip install --upgrade google-api-python-client
ããã§APIãåããããã®æºåã¯å šéšOK
4. ã³ãŒããæžããŠAPIãå©ã
åãã³ãŒãã眮ããŠãããŸããïŒæ¬åœã«ãããã ã§åããããå Žåã¯ããã¡ãã® "The Code" ãšãããšãããåç §ããŠãã ããïŒ
ããã§ã¯äŸãšããŠã ãç«ãïŒæ¥æ¬èªïŒãšããæ€çŽ¢ã¯ãŒãã§ã²ã£ãããç»åã1000æåéããŠã¿ãŸãã
Pythonã®version㯠3.5.2ã§ãå®è¡ã¯ä»¥äž
$ python3 google_api.py
å®è¡ãããšsave_dir_pathã§æå®ãããã£ã¬ã¯ããªäžã«corr_tableãimgsãpickle_filesãšãããã£ã¬ã¯ããªãäœæãããã®äžã«åããŒã¿ãçæããŸãã
# -*- coding:utf-8 -*-
import urllib.request
import httplib2
import json
import os
import pickle
import hashlib
import sha3
from googleapiclient.discovery import build
def make_dir(path):
if not os.path.isdir(path):
os.mkdir(path)
def make_correspondence_table(correspondence_table, original_url, hashed_url):
correspondence_table[original_url] = hashed_url
def getImageUrl(api_key, cse_key, search_word, page_limit, save_dir_path):
service = build("customsearch", "v1", developerKey=api_key)
page_limit = page_limit
startIndex = 1
response = []
img_list = []
make_dir(save_dir_path)
save_res_path = os.path.join(save_dir_path, 'api_response_file')
make_dir(save_res_path)
for nPage in range(0, page_limit):
print("Reading page number:", nPage + 1)
try:
response.append(service.cse().list(
q=search_word, # Search words
cx=cse_key, # custom search engine key
lr='lang_ja', # Search language
num=10, # Number of images obtained by one request (Max 10)
start=startIndex,
searchType='image' # search for images
).execute())
startIndex = response[nPage].get("queries").get("nextPage")[0].get("startIndex")
except Exception as e:
print(e)
with open(os.path.join(save_res_path, 'api_response.pickle'), mode='wb') as f:
pickle.dump(response, f)
for one_res in range(len(response)):
if len(response[one_res]['items']) > 0:
for i in range(len(response[one_res]['items'])):
img_list.append(response[one_res]['items'][i]['link'])
return img_list
def getImage(save_dir_path, img_list):
make_dir(save_dir_path)
save_img_path = os.path.join(save_dir_path, 'imgs')
make_dir(save_img_path)
opener = urllib.request.build_opener()
http = httplib2.Http(".cache")
for i in range(len(img_list)):
try:
url = img_list[i]
extension = os.path.splitext(img_list[i])[-1]
if extension.lower() in ('.jpg', '.jpeg', '.gif', '.png', '.bmp'):
encoded_url = url.encode('utf-8') # required encoding for hashed
hashed_url = hashlib.sha3_256(encoded_url).hexdigest()
full_path = os.path.join(save_img_path, hashed_url + extension.lower())
response, content = http.request(url)
with open(full_path, 'wb') as f:
f.write(content)
print('saved image... {}'.format(url))
make_correspondence_table(correspondence_table, url, hashed_url)
except:
print("failed to download images.")
continue
if __name__ == '__main__':
# -------------- Parameter and Path Settings -------------- #
API_KEY = 'xxxxxxxxxxxxx'
CUSTOM_SEARCH_ENGINE = 'xxxxxxxxxxxxxxx'
page_limit = 10
search_word = 'ç«'
save_dir_path = 'path/to/dir'
correspondence_table = {}
img_list = getImageUrl(API_KEY, CUSTOM_SEARCH_ENGINE, search_word, page_limit, save_dir_path)
getImage(save_dir_path, img_list)
correspondence_table_path = os.path.join(save_dir_path, 'corr_table')
make_dir(correspondence_table_path)
with open(os.path.join(correspondence_table_path, 'corr_table.json'), mode='w') as f:
json.dump(correspondence_table, f)
ã³ãŒãã®äžéšè§£èª¬
ãã©ã¡ãŒã¿ã«ã€ããŠ
-
API_KEYã«Google Developers Consoleã§ååŸããAPI keyãæå® -
CUSTOM_SEARCH_ENGINEã«ã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³ã§ååŸããkeyãæå® - æ€çŽ¢ãããã¯ãšãªãŒã¯
search_wordã§æå®ïŒæ¥æ¬èªãå¯ïŒ - ååŸãããç»åææ°ã¯
page_limitã§æå®ïŒåŸè¿°ïŒ - èœãšããŠããç»åãä¿åããpathã
save_dir_pathã§æå®
ãã®ä»ã®APIãã©ã¡ãŒã¿ã¯ãã¡ããåç §
1ã¯ãšãªãŒã§ååŸã§ããç»åæ°ã¯response.appendã®numã§æå®ã§ããŸãããã®ã¹ã¯ãªããã§ã¯äžéå€ã®10æãæå®ããŠããŸãã
1ã¯ãšãªãŒãpage_limitã§æå®ããåæ°ã ããªãŒããããŠç·ç»åææ°ãååŸããŸããäŸãã°ã1000æç»åãã»ãããã°ãnum=10ã®ç¶æ
ã§ãpage_limit=100ã«ããã°è¯ããšããããšã§ããïŒãããå®éã«ã¯æå®ããææ°ãããå°ãªãæ°ãè¿ã£ãŠããããã§ããïŒ
bingAPIã®ãšãã¯ã次ã®ã«ãŒãã§å§ãŸãç»åã®indexçªå·ãªã©ãèæ
®ããªããšãããŸããã§ããããgoogle APIã®å Žåã¯ãã®èŸºãgoogleapiclientã«ãã£ãŠããæãã«é èœããŠãããŠããã®ã§ãå®è³ªpage_limitãäœååãã°ããããšããããšã ãèããã°è¯ãã ãã§ãã
ããŠãããã§èšäºã®æãéèŠãªç¹ã§ããã
google APIã«ã¯ãã®page_limitã«ãšãã§ããªãå¶éïŒæ¬ é¥ïŒïŒããããŸãã
å
·äœäŸã§ãããšã1000æã®ç»åãåŸãããšæã£ãŠpage_limit=100ãæå®ããŠããå®éã«ã«ãŒããåãã®ã¯ãªããš10ãŸã§ã§ããã以äžã¯çŸç¶ã®APIã§ã¯ã©ãã«ããªããªãããã§ããã€ãŸãã1ã€ã®æ€çŽ¢åèªããAPIãå©ããŠåŸãããç»åã¯Maxã§ã100æãç¡ãããšããããšã§ãã
ãããªãã«ãªãšæãè²ã 調ã¹ãŠã¿ãŸãããããã®åé¡ã«ã¯å€ãã®äººã®é¿éŒ»å«åãèãããã ãã§æªã ã«è§£æ±ºçã代æ¡ãç¡ãããã§ãã
- Unable to get results more than 100 results on google custom search api
- CSE.list: Response 400 Error: Invalid Value for my requests with start > 91
- Custom Search API and More than 100 searches
- "more than 100"ã§ã°ã°ã£ãŠã¿ãŠãã¹ã¬ãããããåºãŠãã
æ¥æ¬èªããã°ã§ã話é¡ã«ããŠããæ¹ã ãããŸãã
ãã¡ãã®Qiitaèšäºã§ããããããšæ€èšŒãããŠããŠåèã«ãªããŸãã
å€ããã®ã ãš2012幎ãããããã¹ã¬ãç«ãŠãããŠããããã§ããæªã ã«ãã®è§£æ±ºçã¯ãªãã¿ããã§ããã§ããããªããšã£ãŠããã®ãïŒãã®ã°ãŒã°ã«ã ãïŒèªåã®è© å±åãäœãã ããªã®ã...誰ãç¥ã£ãŠããæããŠãã ãã
ïŒã¡ãªã¿ã«ãããããããŠç¡ææ ã§ãã£ãŠããããïŒããšæã£ãŠèª²éã詊ããŠã¿ãŸãããåãçµæã§ãããïŒ
ãã ããã¡ãã®APIããã¢å®è¡ã§ãããšããã§å®éã« "startIndex"ãã©ã¡ãŒã¿ã«100æç®ä»¥éã®ç»åãååŸããããã«æå®ããŠã¿ããš400çªãšã©ãŒãè¿ã£ãŠããã®ã§ããã¯ãAPIã®ä»æ§ãšããŠ1æ€çŽ¢åèªã«å¯ŸããŠ100æä»¥äžã®ç»åãäžåã§ååŸããããšã¯ã§ããªãããã§ãã
çŸç¶ã®çµè«: Bing APIã䜿ããŸããã
çµæãã¡ã€ã«ã«ã€ããŠ
python3 google_api.py ãå®è¡ãããšãsave_dir_pathã§æå®ãããã£ã¬ã¯ããªäžã«corr_tableãimgsãpickle_filesãšããïŒã€ã®ãã£ã¬ã¯ããªãäœæãããã®äžã«åããŒã¿ãçæããŸãã
- imgs: APIã«ãã£ãŠåéããç»åãæ ŒçŽããããã£ã¬ã¯ããª
- pickle_files: APIãå©ããŠè¿ã£ãŠããã¬ã¹ãã³ã¹ïŒjsonããŒã¿ïŒãpickle圢åŒã§æ ŒçŽããããã£ã¬ã¯ããªãå®éã«è¿ã£ãŠããjson圢åŒã®äŸã¯ãã¡ããæã ãæ¬²ããç»åã®URLã¯jsonäžã® 'value' -> 'contentUrl' ã«æ ŒçŽãããŠããã®ã§ãããåãåºããŠããŸãã
- corr_table: åéããç»åã®å URLãšããããhashåãããã¡ã€ã«åã®å¯Ÿå¿è¡šãèŸæžåœ¢åŒã§æ ŒçŽãããŠãããã£ã¬ã¯ããªïŒãç»åä¿åæã®ãã¡ã€ã«åã«ã€ããŠããåç §ïŒãç¹ã«å¿ èŠãªããšæããŸãããäžå¿ããŒã¿ãšããŠæžãåºããŠãããŸãã
察象ç»åçš®
ããã§ã¯jpg, jpeg, gif, png, bmpã®æ¡åŒµåãæã€ç»åã®ã¿ãååŸã®å¯Ÿè±¡ãšããŠããŸã
ç»åä¿åæã®ãã¡ã€ã«åã«ã€ããŠ
ä¿åããç»åãã¡ã€ã«åã¯äœãèããã«é£çªã§ãè¯ãã£ãã®ã§ãããæ©æ¢°åŠç¿ã«çšããç»åã®ããã§ããã ãåäžã®ç»åã¯çããããšããã§ãã
ããã§ãä¿åç»ååãç»åååŸæã®URLã«ããŠéè€ããååã¯åæã«ä¿åæã«äžæžããããããã«ããããšããŸããããURLãé·ããããã¡ã€ã«ãååšããïŒãã¡ã€ã«åãé·ããªãïŒããã«ä¿åæã«æ¯éãã§ããã®ããããŸããã
ãã®å¯ŸçãšããŠãç»åååŸæã®URLã«å¯ŸããŠhashååŠçãè¡ããŸããã
hashåã¯å
ã
æå·åã®ããã«çšãããããã®ã§ãããå
ã®æåæ°ã«é¢ä¿ãªã65æåã»ã©ã®æååã«å€æããŠãããïŒåãå
容ããã¯åãæååãçæãã ãšããç¹åŸŽãããã®ã§ããããå©çšããŠãã¡ã€ã«åãçãããã®ãšåæã«ãåå
容ã®ç»åãã¡ã€ã«ã¯éè€ãšããŠäžæžãã§ããŸãã
pythonã®hashåã«ã¯hashlibãçšããhashåã¢ã«ãŽãªãºã ã®sha3ã«ã€ããŠã¯ãã¡ãã®ããã°ãåç
§ããŸããã
http://hogehogehogehoge~~~/cat.jpgïŒé·ãURLïŒ-> hashå -> 65æ¡ã»ã©ã®èšå·åâ ãçæ
http://fugafugafugafuga~~~/cat2.jpgïŒé·ãURLïŒ-> hashå -> 65æ¡ã»ã©ã®èšå·åâ¡ãçæ
http://hogehogehogehoge~~~/cat.jpgïŒé·ãURLïŒ-> hashå -> â ãšåã65æ¡ã»ã©ã®èšå·åãçæ
ã¢ã¯ã»ã¹å¶éã«ã€ããŠïŒèª²ééé¡ïŒ
Custom Search APIã®ç¡ææ ã®å©çšå¶é㯠100ã¯ãšãªãŒ/æ¥ ã§ãã
1ã¯ãšãªãŒã§æå€§10æç»åãååŸã§ããã®ã§ãæ°å€äžã¯ç¡æã§ 1000æ/æ¥ ã®ç»åãååŸã§ããŸãããåè¿°ãããšãã1æ€çŽ¢åèªã«å¯ŸããŠããããæå€§10ã¯ãšãªãŒããã«ãŒãã§ããªãïŒæå€§100æããååŸã§ããªãïŒãšããAPI仿§çãªå¶éããããŸãã
ã¡ãªã¿ã«ãç¡ææ ãè¶ããŠå©çšãããå Žå㯠1000ã¯ãšãªãŒããã$5ã ããã§ãã
ãã®ä»ã®å¶éãšããŠïŒåé¡ã«ãªããªããšæããŸãããïŒãŠãŒã¶1人ã100ç§éã«æããããã¯ãšãªãŒæ°ã®äžéã¯100ã¯ãšãªãŒã ããã§ãã
èªèº«ã®ã¢ã«ãŠã³ãã®èª²éç¶æ ã調ã¹ããå Žåã¯ãã¡ããåç §
çµæãšææ
äžèšã®éãããç«ããšããããŒã¯ãŒãã§1000æç»åãååŸããããšããŠããå®éã«ã¯92æããç«ç»åãååŸããããšãã§ããŸããã§ãããïŒã¡ãªã¿ã«Bing APIã§åæ§ã®ããšããããš824æã²ããã§ããŸãããïŒ
Bing APIãBing APIã§ããªããéäžã®ã«ãŒãããã²ãããåãç»åãåéãããããªãã°ãããã£ãœãã§ãããããã§ã92æããã¯å€§åãã·ã§ãã
ãšããããã§ãç»åæ€çŽ¢APIã䜿ã£ãŠç»ååéãè¡ãããå Žåã¯ãŸãBing APIã§1000æåŒ±ãããã®ç»åããµã¯ããšåã£ãŠããŠãããã«éã®æ¶ã§ãæ°èŠã®ç»åããšã«ããæ¬²ãããšãããããå矜詰ãŸã£ãŠããã®ã§ããã°google APIã䜵ããŠäœ¿ã£ãŠã¿ãã°è¯ãã®ã§ã¯ããšããæãã§ãã
æ¬åœã®æ¬åœã«ãã£ãšå€§éã®ç»åïŒ1000æ~ïŒãååŸãããå Žåã¯ãSeleniumãªã©ã䜿ã£ãŠããŒãžãèªåããŒãããŠããã¿ã€ãã®scraperãäœãïŒoræ¢ãïŒãããªãããªãšæããŸãã
ïŒ20170926远èšïŒãŸãšãèšäºãæžããŸãã â YahooãBingãGoogleã§ã®ç»ååéäºæ ãŸãšã
Github
äžèšãšåæ§ã®å 容ãGithubã«ãèŒããŠããŸããAPIkeyãæ€çŽ¢ãšã³ãžã³IDã®æå®æ¹æ³ã ãç°ãªããŸãã®ã§READMEãåç §ããŠãã ãã
åè
- Google API Client Libraries > Python > Getting Started
-
URLãšã³ã³ãŒãã»ãã³ãŒã
- "ç«"ã®ããã«æ¥æ¬èªãæ€çŽ¢åèªã«æå®ãããšãšã³ã³ãŒããããæååãURLã«æå®ãããŸããäŸã«ãã£ãŠPython3ã2ç³»ã§ã¯æ¥æ¬èªã®ãšã³ã³ãŒãåšããåä»ãªã®ã§ããã§ãšã³ã³ãŒããããæååãªã©ã確èªãã€ã€ç®çã®æååãæ£ããæ€çŽ¢ãããŠããã確èªããŠããŸãã
- ãã«ã¹ã¿ã æ€çŽ¢ãšã³ãžã³ãäœææã«ã¡ãã£ãšããã£ããšãããåèã«ãããŠããããŸãã èšäº1ãèšäº2


