본문 바로가기

데이터분석/Web Crawler

(Crawler) selenium으로 이미지 크롤링

Selenium을 사용하여 Google 이미지에서 사람(person) 이미지를 가져오는 crawler를 만들어 보겠습니다.

crawler는 python3를 사용하여 제작했습니다.


소스코드 대한 정보는 아래 블로그를 참조했습니다.

https://jeongmin-lee.tistory.com/4?category=765520


이번 포스트에서 소개하는 내용은 아래와 같습니다.

  1. Selenium 이란?
  2. Window에서 이미지 크롤링하기
  3. Ubuntu(Linux)에서 이미지 크롤링하기

1. Selenium 이란?


Selenium은 웹 응용 프로그램을 테스트 하기 위한 프레임 워크이다.

다양한 브라우저(Chrome, Firefox 등), 다양한 언어(Java, Python, PHP 등)를 지원한다.
(브라우저를 자동화하는 오픈소스 프레임워크라고 할 수 있다.)

Webdriver 다운로드

크롤링을 하기 위해서는 브라우저 드라이브가 필요하기 때문에 아래 사이트에서 해당하는 것을 다운로드를 한다.


Window에서는 Chrome deriver를 사용할 것이고, 
Ubuntu에서는 기본 브라우저가 Firefox이기 때문에 geckodriver를 사용할 것이다.
ubuntu에서는 geckodriver를 /usr/local/bin/으로 옮겨준다.

Selenium 설치

Window에서 selenium 설치 및 Test

1
pip install selenium  # window
cs

chrome으로 구글에 접속 후 브라우저를 끄는 코드이다.
1
2
3
4
5
from selenium import webdriver
 
browser = webdriver.Chrome('chromedriver 저장 경로')
browser.get('https://www.google.com')
browser.close()
cs

Ubuntu에서 selenum 설치 및 Test

1
2
sudo apt-get install python3-selenium # ubuntu
vi test.py
cs

Firefox로 구글에 접속 후 브라우저를 끄는 코드이다.

(webdriver인 geckodriver의 경로는 /usr/local/bin/에 있어야한다.)

1
2
3
4
5
from selenium import webdriver
 
browser = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver')
browser.get('https://www.google.com')
browser.close()
cs

2. Window에서 이미지 크롤링



1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import json
import os
import urllib.request
 
#찾고자 하는 검색어를 url로 만들어 준다.
searchterm = 'person'
url = "https://www.google.com/search?q="+searchterm+"&source=lnms&tbm=isch"
# chrom webdriver 사용하여 브라우저를 가져온다.
browser = webdriver.Chrome('./chromedriver/chromedriver')
browser.get(url)
cs

▲ 구글에서 person을 검색해서 나온 이미지를 결과를 chrome 브라우저로 가져온다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# User-Agent를 통해 봇이 아닌 유저정보라는 것을 위해 사용
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
 
print(os.path)
# 소스코드가 있는 경로에 '검색어' 폴더가 없으면 만들어준다.(이미지 저장 폴더를 위해서) 
if not os.path.exists(searchterm):
    os.mkdir(searchterm)
 
for _ in range(500):
    # 가로 = 0, 세로 = 10000 픽셀 스크롤한다.
    browser.execute_script("window.scrollBy(0,10000)")
cs

▲ 1~10 : header 값을 주고 이미지를 저장 하기 위한 폴더를 만들어준다.

    12 ~ 14 :  더 많은 이미지 정보를 가져오기 위해 스크롤을 내려준다.


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
# div태그에서 class name이 rg_meta인 것을 찾아온다
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"])
 
    # 이미지 url
    img = json.loads(x.get_attribute('innerHTML'))["ou"]
    # 이미지 확장자
    imgtype = json.loads(x.get_attribute('innerHTML'))["ity"]
    
    # 구글 이미지를 읽고 저장한다.
    try:
        req = urllib.request(img, headers={'User-Agent': header})
        raw_img = urllib.request.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, "succesfully downloaded")
browser.close()
 
cs
▲ 2 : div 태그에서 class name이 rg_meta인 것을 모두 가져온다.

      실제로 구글에서 이미지에서 개발자도구를 통해 rg_meta중 하나는 다음과 같다.


  rg_meta의 속성을 살펴보면 'ou'가 이미지 url, 'ity'가 확장자인 것을 확인 할 수 있다.    

8 ~ 11 : 이미지의 url과 확장자를 가진 속성인 ou, ity의 정보를 가져온다.

15 ~ 19 : 이미지 url을 통해 이미지를 읽어와 파일로 저장한다.

25 : 브라우저를 종료한다.

3. Ubuntu에서 이미지 크롤링


window에서 이미지 크롤링과 차이점은 아래의 코드 차이를 빼고 같다.

1
2
3
browser = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver')
header={'User-Agent':"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"}
req = urllib.request.Request(img, headers={'User-Agent': header})
cs
Firefox webdriver를 사용

ubuntu에 맞는 header

이유는 아직 찾지 못했지만 ubuntu에서 urllib.request를 사용할때 urllib.request.Request를 사용해준다.


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 selenium import webdriver
from selenium.webdriver.common.keys import Keys
import json
import os
import urllib.request
 
#찾고자 하는 검색어를 url로 만들어 준다.
searchterm = 'person' # will also be the name of the folder
url = "https://www.google.co.in/search?q="+searchterm+"&source=lnms&tbm=isch"
# Firefox webdriver 사용하여 브라우저를 가져온다.
browser = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver')
browser.get(url)
 
# User-Agent를 통해 봇이 아닌 유저정보라는 것을 위해 사용
header={'User-Agent':"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"}
# 이미지 카운트 (이미지 저장할 때 사용하기 위해서)
counter = 0
succounter = 0
 
print(os.path)
# 소스코드가 있는 경로에 '검색어' 폴더가 없으면 만들어준다.(이미지 저장 폴더를 위해서) 
if not os.path.exists(searchterm):
    os.mkdir(searchterm)
 
for _ in range(500):
    # 가로 = 0, 세로 = 10000 픽셀 스크롤한다.
    browser.execute_script("window.scrollBy(0,10000)")
 
# div태그에서 class name이 rg_meta인 것을 찾아온다
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"])
 
    # 이미지 url
    img = json.loads(x.get_attribute('innerHTML'))["ou"]
    # 이미지 확장자
    imgtype = json.loads(x.get_attribute('innerHTML'))["ity"]
    
    # 구글 이미지를 읽고 저장한다.
    try:
        req = urllib.request.Request(img, headers={'User-Agent': header})
        raw_img = urllib.request.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, "succesfully downloaded")
browser.close()
 
cs


'데이터분석 > Web Crawler' 카테고리의 다른 글

(Crawler) 다이닝코드 웹 페이지 가져오기  (3) 2019.02.14