본문 바로가기

Capstone/2018-2 Capstone

① 이미지 크롤링

① 이미지 크롤링 (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

설치 후 사용할 브라우저의 드라이버를 다운 받습니다.

저는 크롬으로 사용할꺼라 크롬 드라이버를 사용했습니다.

Chromehttps://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장의 거미 사진을 다운 받았습니다.

하지만 이미지를 증가하기 전에 거미가 아닌 사진을 삭제해 199개로 골라내었습니다.




반응형

'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