Selenium을 사용하여 Google 이미지에서 사람(person) 이미지를 가져오는 crawler를 만들어 보겠습니다.
crawler는 python3를 사용하여 제작했습니다.
소스코드 대한 정보는 아래 블로그를 참조했습니다.
https://jeongmin-lee.tistory.com/4?category=765520
이번 포스트에서 소개하는 내용은 아래와 같습니다.
- Selenium 이란?
- Window에서 이미지 크롤링하기
- Ubuntu(Linux)에서 이미지 크롤링하기
1. Selenium 이란?
Selenium은 웹 응용 프로그램을 테스트 하기 위한 프레임 워크이다.
Webdriver 다운로드
Selenium 설치
Window에서 selenium 설치 및 Test
1 | pip install selenium # window | cs |
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 |
실제로 구글에서 이미지에서 개발자도구를 통해 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 |
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 |
---|