① 이미지 크롤링 (Image Crawling)
Google 이미지에서 거미(spider)이미지를 가져옵니다.
Google 이미지는 페이지 스크롤 없이 최대 100개만 가져옵니다.
하지만 Selenium을 사용하면 더 많은 이미지를 가져올 수 있습니다.
Selenium 란?
selenium은 브라우저를 자동화하는 오픈소스 프레임워크 입니다.
Windows, Linux, MacOS 플랫폼에서 사용할 수 있습니다.
이미지 크롤링을 위해 사용할 selenium 구성요소는 Webdriver으로, 브라우저 드라이버의 특정 브라우저를 통해 시행되며 브라우저로 명령을 보내면 결과를 가져옵니다.
실제로 브라우저 응용프로그램 ( ex. Firefox, Chrome, Internet Explorer, Safari, Microsoft Edge)을 실행하고 액세스합니다.
Selenium 설치
selenium 모듈을 설치합니다.
1 | pip install selenium | cs |
설치 후 사용할 브라우저의 드라이버를 다운 받습니다.
저는 크롬으로 사용할꺼라 크롬 드라이버를 사용했습니다.
Chrome : https://sites.google.com/a/chromium.org/chromedriver/downloads
Selenium 사용
selenium.webdriver 모듈을 import 한 후, webdriver.Chrome()를 호출하여 브라우저를 실행합니다.
webdriver.Chrome('webdriver 저장 경로') 형태로 드라이버 저장 경로를 넣어주면 됩니다.
1 2 3 4 5 6 | from selenium import webdriver browser = webdriver.Chrome('chromedriver 저장 경로') browser.get('https://www.google.com') browser.close() | cs |
그러면 이제 selenium을 사용해서 구글 이미지를 다운받겠습니다.
소스 코드는 Github에서 가져와 사용했습니다.
python2를 사용했습니다.
python3에서 사용하려면 urllib2 => urllib.request로 사용해야합니다.
코드를 실행하는 법은 python 코드_이름.py --search "찾을 단어" --num_image 100 --directory "저장 경로"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | from bs4 import BeautifulSoup import requests import re import urllib2 import os import argparse import sys import json # adapted from http://stackoverflow.com/questions/20716842/python-download-images-from-google-image-search def get_soup(url,header): return BeautifulSoup(urllib2.urlopen(urllib2.Request(url,headers=header)),'html.parser') def main(args): parser = argparse.ArgumentParser(description='Scrape Google images') parser.add_argument('-s', '--search', default='bananas', type=str, help='search term') parser.add_argument('-n', '--num_images', default=10, type=int, help='num images to save') parser.add_argument('-d', '--directory', default='/Users/gene/Downloads/', type=str, help='save directory') args = parser.parse_args() query = args.search#raw_input(args.search) max_images = args.num_images save_directory = args.directory image_type="Action" query= query.split() query='+'.join(query) url="https://www.google.co.in/search?q="+query+"&source=lnms&tbm=isch" header={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"} soup = get_soup(url,header) ActualImages=[]# contains the link for Large original images, type of image for a in soup.find_all("div",{"class":"rg_meta"}): link , Type =json.loads(a.text)["ou"] ,json.loads(a.text)["ity"] ActualImages.append((link,Type)) for i , (img , Type) in enumerate( ActualImages[0:max_images]): try: req = urllib2.Request(img, headers={'User-Agent' : header}) raw_img = urllib2.urlopen(req).read() if len(Type)==0: f = open(os.path.join(save_directory , "img" + "_"+ str(i)+".jpg"), 'wb') else : f = open(os.path.join(save_directory , "img" + "_"+ str(i)+"."+Type), 'wb') f.write(raw_img) f.close() except Exception as e: print "could not load : "+img print e if __name__ == '__main__': from sys import argv try: main(argv) except KeyboardInterrupt: pass sys.exit() | cs |
출처 : https://gist.github.com/genekogan/ebd77196e4bf0705db51f86431099e57
하지만 이 코드는 이미지를 최대 100개만 가져옵니다.
그래서 selenium을 사용한 코드를 사용했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | from selenium import webdriver from selenium.webdriver.common.keys import Keys import json import os import urllib2 import argparse searchterm = 'spider' # will also be the name of the folder url = "https://www.google.co.in/search?q="+searchterm+"&source=lnms&tbm=isch" # NEED TO DOWNLOAD CHROMEDRIVER, insert path to chromedriver inside parentheses in following line browser = webdriver.Chrome('/Users/ijeongmin/Capstone/chromedriver') browser.get(url) header={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"} counter = 0 succounter = 0 if not os.path.exists(searchterm): os.mkdir(searchterm) for _ in range(500): browser.execute_script("window.scrollBy(0,10000)") for x in browser.find_elements_by_xpath('//div[contains(@class,"rg_meta")]'): counter = counter + 1 print "Total Count:", counter print "Succsessful Count:", succounter print "URL:",json.loads(x.get_attribute('innerHTML'))["ou"] img = json.loads(x.get_attribute('innerHTML'))["ou"] imgtype = json.loads(x.get_attribute('innerHTML'))["ity"] try: req = urllib2.Request(img, headers={'User-Agent': header}) raw_img = urllib2.urlopen(req).read() File = open(os.path.join(searchterm , searchterm + "_" + str(counter) + "." + imgtype), "wb") File.write(raw_img) File.close() succounter = succounter + 1 except: print "can't get img" print succounter, "pictures succesfully downloaded" browser.close() | cs |
출처 : https://gist.github.com/genekogan/ebd77196e4bf0705db51f86431099e57
저는 거미 사진을 모으기 위해 searchterm에 spider을 넣었습니다.
이렇게 google image에서 400장의 거미 사진을 다운 받았습니다.
'Capstone > 2018-2 Capstone' 카테고리의 다른 글
⑥ Yolov3 on raspberry pi 3 B+ (3) | 2018.12.23 |
---|---|
⑤ Yolo_mark (0) | 2018.12.22 |
④ YOLO Custom (0) | 2018.12.14 |
③ YOLO란? (0) | 2018.12.14 |
② 이미지 부풀리기 (11) | 2018.12.09 |