
Pythonã§ãã£ãŠã¿ãïŒïŒç»åã®èªåååŸ
ïŒïŒæŠèŠ
ãç»åã®æ©æ¢°åŠç¿ãå®è¡ããå Žå倧éã®ç»åããŒã¿ãå¿
èŠã«ãªããŸããä»åã¯Webããèªåã§ç»åããŒã¿ãååŸããŸãã
ãåèã
äŒç€Ÿã§å質管çãªã©ãããå Žåã¯ç¬èªã®ç»åããŒã¿ã«ãªãããèªç€Ÿã®ããŒã¿ããŒã¹ããååŸãããããªãå Žåã¯èªåã§æ®åœ±ããå¿
èŠããããŸãã
ïŒïŒPythonã©ã€ãã©ãªïŒiCrawler
äžã€ç®ã®ææ³ãšããŠã¯Pythonã©ã€ãã©ãªã®ãiCrawlerãã䜿çšããŸããããã«ããç°¡åã«ç»åãååŸã§ããŸãã
pip install icrawler泚æç¹ããŠiCralwlerã®ãGoogleImageCrawlerãã䜿çšã§ããªãå¯èœæ§ãããããBingã䜿çšããŸããã
[In]
from icrawler.builtin import BingImageCrawler
import os
searchkeywords = 'çŸå¥³' # æ€çŽ¢ããããŒã¯ãŒã
savedir = 'photos_çŸå¥³' # ç»åãä¿åãããã£ã¬ã¯ããª
counts = 100 # åéããããŒã¿æ°
def getimages(q=searchkeywords, maxnum=counts, save_dir=savedir):
if not os.path.exists(savedir): # ãã£ã¬ã¯ããªããªããã°äœã
os.mkdir(savedir)
print(f'{savedir}ãã©ã«ããäœæããŸããã')
bing_crawler = BingImageCrawler(storage={'root_dir': save_dir})
bing_crawler.crawl(keyword=q, max_num=maxnum, filters=None) #filtersã§ã¯ç»åã®ãµã€ãºãã¿ã€ããæå®å¯èœ
getimages(q=searchkeywords, maxnum=counts, save_dir=savedir) 
ãåºåçµæã

ããã ãã§ç°¡åã«ç»åãååŸã§ããŸãããä»åã¯53æååŸã§ããŸããããšã©ãŒã§ååŸã§ããªãã£ãåãã¯ããããããã§ãã
ãåèïŒïŒtrain/valçšããŒã¿ååŸã
ãå¥èšäºã§ãã©ã«ãïŒç»åååŸãã颿°ãäœæããã®ã§ãåèãŸã§ã«
[IN]
import os
import glob
from icrawler.builtin import BingImageCrawler
#ãã©ã«ãäœæ
def make_dirs(rootpath='./'):
if not os.path.exists(f'{rootpath}/data'): os.makedirs(f'{rootpath}/data') #ããŒã¿ä¿åçšïŒã«ãŒã
if not os.path.exists(f'{rootpath}/data/train'): os.makedirs(f'{rootpath}/data/train') #trainçšããŒã¿
if not os.path.exists(f'{rootpath}/data/val'): os.makedirs(f'{rootpath}/data/val') #valçšããŒã¿
def getimages(keys, maxnum, save_dir):
for keyword in keys:
bing_crawler = BingImageCrawler(storage={'root_dir': save_dir})
bing_crawler.crawl(keyword=keyword, max_num=maxnum, filters=None) #filtersã§ã¯ç»åã®ãµã€ãºãã¿ã€ããæå®å¯
#ãã¡ã€ã«åã®æžãæã
_path_imgs = glob.glob(f'{save_dir}/*') #å
šãŠã®ç»åãã¹ãååŸ
path_imgs = [i for i in _path_imgs if os.path.basename(i)[0].isdigit()] #æ°åã§å§ãŸããã¡ã€ã«åã®ã¿åŠç
for idx, path_img in enumerate(path_imgs):
dirname = os.path.dirname(path_img)
extension = os.path.basename(path_img).split('.')[-1]
os.rename(path_img, os.path.join(dirname, f'{keyword}_{idx}.{extension}'))
#ç»åã®ååŸ
keywords = ['dog', 'cat'] #æ€çŽ¢ããŒã¯ãŒããšä¿åå
ã®æå®
#ãã©ã«ãäœæ
make_dirs()
#ããŒã¿ååŸ
getimages(keys=keywords, maxnum=2, save_dir='data/train') #trainçšããŒã¿ã®ååŸ
getimages(keys=keywords, maxnum=2, save_dir='data/val') #valçšããŒã¿ã®ååŸ
[OUT]
ïŒïŒHTTPã¯ã©ã€ã¢ã³ãïŒurllib.request
ã»ãããã¡ã€ã«ã®URLãåãã£ãŠããã®ã§ããã°Pythonæšæºã©ã€ãã©ãªã®urllib.requestã䜿çšå¯èœã§ãã䜿çšäŸãšããŠã¹ã¯ã¬ã€ãã³ã°ã§æå®ãµã€ãã®URLãåéããŠããã®URLãé£ç¶åŠçããããšã§ããŒã¿ååŸã§ããŸãã
ç»åã¯äžèšèšäºã®ãã¡ã€ã«ãªã³ã¯ã䜿çšããŸããã
[In]
import urllib
url= 'https://note.com/api/v2/attachments/download/f6b77f70d3749b3a7bbda8830ff8083a'
urllib.request.urlretrieve(url, 'test.jpg')
[Out]äžèšã®éãtest.jpgãã¡ã€ã«ãäœæããã
ïŒïŒAPIã®äœ¿çš
ãæ¬¡ã¯APIã䜿çšããŠããŒã¿ãååŸããŸããAPIã¯ç°¡åã«ãããšç¹å®ã®ãµãŒãã¹ãHTTPã¯ã©ã€ã¢ã³ããªã©ãå©çšããŠç°¡åã«äœ¿ãããµãŒãã¹ã§ãã
ãAPIã¯äŒæ¥ãæäŸããŠãããã䜿çšã§ããªããµãŒãã¹ã倿°ãããŸãã
ïŒãŒïŒïŒAPIïŒãã©ãèµ
ãAPIäœ¿çšæã«ç»é²ããããªããµã€ããšããŠããã©ãèµãããããŸãããªãåç»å ±æã¯ãµãŒãã¹ãçµäºããŠããåçã®ã¿ãšãªããŸãããçŸå¥³ãåçããªãã£ãã®ã§ããŒã¿æ°ãæ¯èŒçå°ãªãå¯èœæ§ããããŸãã
ïŒïŒïŒïŒïŒïŒHTTPã¯ã©ã€ã¢ã³ãã«ããAPIã®å©çš
ãã£ãã説æãããšããã©ãèµã«ããŒã¯ãŒããå«ããäŸé Œä¿¡å·ãéã£ãŠçµæãè¿ããŠããããŸãã
[In]
import requests
endpoint = 'https://api.photozou.jp/rest/search_public.json' #APIã®ãšã³ããã€ã³ã
keyword = 'ã€ã±ã¡ã³' #ããŒã¯ãŒãïŒçŸå¥³ã¯æ€çŽ¢çµæ0ã ã£ããã倿Ž
url = endpoint + '?keyword=' + keyword #ããŒã¯ãŒããURLã«è¿œå
res = requests.get(url) #APIãå©ã
res.json() #JSON圢åŒã§è¿ã£ãŠãã[Out]
{'stat': 'ok',
'info': {'CONTENTS_VIEW_LANG': True,
'NO_VIEW_FCEBOOK_TWITTER': False,
'photo_num': 100,
'photo': [{'photo_id': 269023538,
'user_id': 3097248,
'album_id': 8234203,
'photo_title': 'Nov12#ææç¬¬5話æ ç»ã®æ§ãªæçµè©±ã®æ§ãªãšã³ãã£ã³ã°ã«æ¥æ¬åå³¶å·æ³£(TT)ãããããã® âææâ ãšããææ
ãããã¶ãããããŠããéã£ãŠããŸã£ãããç¹çŽ°ãªæŒåºãäžå¯§ãªäŒç·èå¯ããªããä»ã¯ãŒã«æé«ã',
'favorite_num': 1,
'comment_num': 0,
'view_num': 27,
'copyright': 'normal',
'original_height': 1151,
'original_width': 2048,
'geo': {'latitude': 0, 'longitude': 0},
'date': '2021-11-14',
'regist_time': '2021-11-20T22:53:15+09:00',
'url': 'http://photozou.jp/photo/show/3097248/269023538',
'image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538.jpg',
'original_image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538_org.jpg',
'thumbnail_image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538_thumbnail.jpg',
'large_tag': '<a href="http://photozou.jp/photo/show/3097248/269023538"><img src="https://kura4.photozou.jp/pub/248/3097248/photo/269023538.v1637456437.jpg" alt="Nov12#ææç¬¬5話æ ç»ã®æ§ãªæçµè©±ã®æ§ãªãšã³ãã£ã³ã°ã«æ¥æ¬åå³¶å·æ³£(TT)ãããããã® âææâ ãšããææ
ãããã¶ãããããŠããéã£ãŠããŸã£ãããç¹çŽ°ãªæŒåºãäžå¯§ãªäŒç·èå¯ããªããä»ã¯ãŒã«æé«ã" width="450" height="253"></a><br><a href="http://photozou.jp/photo/show/3097248/269023538">Nov12#ææç¬¬5話æ ç»ã®æ§ãªæçµè©±ã®æ§ãªãšã³ãã£ã³ã°ã«æ¥æ¬åå³¶å·æ³£(TT)ãããããã® âææâ ãšããææ
ãããã¶ãããããŠããéã£ãŠããŸã£ãããç¹çŽ°ãªæŒåºãäžå¯§ãªäŒç·èå¯ããªããä»ã¯ãŒã«æé«ã</a> posted by <a href="http://photozou.jp/user/top/3097248">(C)@y4uk</a>',
'medium_tag': '<a href="http://photozou.jp/photo/show/3097248/269023538"><img src="https://kura4.photozou.jp/pub/248/3097248/photo/269023538.v1637456437.jpg" alt="Nov12#ææç¬¬5話æ ç»ã®æ§ãªæçµè©±ã®æ§ãªãšã³ãã£ã³ã°ã«æ¥æ¬åå³¶å·æ³£(TT)ãããããã® âææâ ãšããææ
ãããã¶ãããããŠããéã£ãŠããŸã£ãããç¹çŽ°ãªæŒåºãäžå¯§ãªäŒç·èå¯ããªããä»ã¯ãŒã«æé«ã" width="240" height="134"></a><br><a href="http://photozou.jp/photo/show/3097248/269023538">Nov12#ææç¬¬5話æ ç»ã®æ§ãªæçµè©±ã®æ§ãªãšã³ãã£ã³ã°ã«æ¥æ¬åå³¶å·æ³£(TT)ãããããã® âææâ ãšããææ
ãããã¶ãããããŠããéã£ãŠããŸã£ãããç¹çŽ°ãªæŒåºãäžå¯§ãªäŒç·èå¯ããªããä»ã¯ãŒã«æé«ã</a> posted by <a href="http://photozou.jp/user/top/3097248">(C)@y4uk</a>'},
{'photo_id': 269023536,
'user_id': 3097248,
show more (open the raw output data in a text editor) ...
'url': 'http://photozou.jp/photo/show/207472/263869598',
'image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598.jpg',
'original_image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598_org.jpg',
'thumbnail_image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598_thumbnail.jpg',
'large_tag': '<a href="http://photozou.jp/photo/show/207472/263869598"><img ïŒïŒïŒïŒïŒïŒAPIã®æ»ãå€ãåŠç
è¿ãå€ã®JSONã¯ãã¡ããã¡ãããŠããããã«èŠããŸããåè§£ããŠã¿ããšäžèšã®éãã§ãã
ãinfo_Keyå
ã®photo_Keyã®å€ããªã¹ã->ãªã¹ãå
ã®image_url_KeyãURLã
è¿ãå€ããURLãæœåºããŠç»åãDLããã³ãŒãã¯äžèšã®éãã§ãã
[In]
import requests
import urllib
#APIãå©ãåŠç
endpoint = 'https://api.photozou.jp/rest/search_public.json' #APIã®ãšã³ããã€ã³ã
keyword = 'ã€ã±ã¡ã³' #ããŒã¯ãŒãïŒçŸå¥³ã¯æ€çŽ¢çµæ0ã ã£ããã倿Ž
url = endpoint + '?keyword=' + keyword #ããŒã¯ãŒããURLã«è¿œå
res = requests.get(url) #APIãå©ã
#è¿ãå€ããç»åã®URLãæœåºããŠããŠã³ããŒã
datas = res.json()['info']['photo']
print(type(datas), len(datas))
datas = datas[:10] #10ä»¶ã ãååŸ
savedir= 'photo_ãã©ãèµ' #ä¿åãããã£ã¬ã¯ããªå
if not os.path.exists(savedir): # ãã£ã¬ã¯ããªããªããã°äœã
os.mkdir(savedir)
print(f'{savedir}ãã©ã«ããäœæããŸããã')
for idx, data in enumerate(datas):
url = data['image_url'] #ç»åã®URL
filepath = os.path.join(savedir, f'{idx:03d}.jpg') #ä¿åãããã¡ã€ã«åãæå®
urllib.request.urlretrieve(url, filepath)
ïŒïŒïŒïŒFlickr
ãAPIã®ç»é²ãå¿ èŠã§ããå¥ã®ãµãŒãã¹ãšããŠFlickrããããŸãã
ïŒïŒïŒïŒïŒïŒäºåæºå
ãã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ã
äºåã«å°çšã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
pip install flickrapiãAPIç»é²ã
ã©ã€ãã©ãªãšã¯å¥ã«APIã®ç»é²ãå¿
èŠãšãªããŸãã
ãAPIã®çºè¡æé ã¯äžèšãµã€ãããäžèšã®éãã§ãã

ãçºè¡ãããKeyãšSecretãã¡ã¢ããŠãããŸãã
ïŒïŒïŒïŒïŒïŒAPIãå©ããŠåçãååŸ
ãKeyãšSecretãååŸããå€ã«å ¥ãæ¿ãããšAPIã§åçãååŸã§ããŸãã
[In]
Key = '47dfxxxxxxxxxxxxxxxxxx2d'
Secret = 'ff5xxxxxxxxxxxxxxxxxaf'
from flickrapi import FlickrAPI
import urllib
def jsondatas_flicker(Key, Secret, keyword):
flickr = FlickrAPI(Key, Secret, format='parsed-json')
photos = flickr.photos.search(
text=keyword, # æ€çŽ¢ããããŒã¯ãŒã
per_page=10, # ååŸããç»åã®æ°
media = 'photo', # åçã®ã¿
sort = 'relevance' # é¢é£åºŠé
)
return photos
def download_flickr(photos, savedir):
if not os.path.exists(savedir): # ãã£ã¬ã¯ããªããªããã°äœã
os.mkdir(savedir)
print(f'{savedir}ãã©ã«ããäœæããŸããã')
for idx, photo in enumerate(photos['photos']['photo']):
url = 'https://farm{farm}.staticflickr.com/{server}/{id}_{secret}.jpg'.format(
farm = photo['farm'],
server = photo['server'],
id = photo['id'],
secret = photo['secret']
)
filepath = os.path.join(savedir, f'{idx:03d}.jpg') #ä¿åãããã¡ã€ã«åãæå®
urllib.request.urlretrieve(url, filepath)
photos = jsondatas_flicker(Key, Secret, keyword='çŸå¥³')
download_flickr(photos=photos, savedir='photo_flicker')
ãphoto_flickerãã©ã«ãã«çŸå¥³ã®åçã10æååŸãããŸããã
ããšãã
ããšããããgifãèŠããªãå¯èœæ§ãããã®ã§ãããã¯noteã®ã¢ããããŒãåŸã§å¯Ÿå¿äºå®
ãpixelãµã€ãºã®ç·šéã§gifãæçš¿ã§ãããããã£ãšäžæ©é²ãã ïŒ