본문 바로가기
프로그래밍

파이썬 크롤링(웹 스크래핑) - 이미지 스크래핑하기, dload, selenium, bs4

by 조크리 2020. 10. 1.
반응형

 

 

 

※스파르타 코딩 파이썬 무료 강의 정리

 

이번 글은 파이썬으로 이미지 웹 스크래핑 하는 방법을 정리해보려한다!

 

웹 스크래핑이란 '웹 페이지에서 내가 원하는 부분의 데이터를 수집해오는 것'을 말한다. 

웹 스크래핑은 크롤링이라고도 부른다. 

 

웹 스크래핑을 하기 위해서는 특정 웹페이지를 구성하는 HTML 정보를 받아와야하는데 

다양한 방법 중 파이썬으로 크롬 브라우저를 직접 제어하여 웹 페이지를 띄우고 HTML을 읽어오는 방식을 배웠기에 이 방식을 정리해보려한다. 

 

웹 스크랩핑의 첫 단계는 패키지 설치이다.

 

보통 1개의 프로젝트를 만들 때에는 virtual environment(venv)라는 가상환경 폴더 안에서 작업을 한다.

이건 파이참을 이용할 때는 따로 설정 안해도 되고 venv라는 폴더 안에 라이브러리, 즉 패키지를 설치하면 된다. 

 

패키지 설치 방법

 

 

파이썬 패키지(라이브러리) 설치하기 - 파이참 편집기에서 dload패키지 설치

 

 

 

 

1. 파이썬 패키지(라이브러리) 설치하기

 

파이썬에서 '패키지'는 모듈을 모아 놓은 단위이다.

'패키지'의 묶음은 '라이브러리'라고 한다. 

하지만 패키지나 라이브러리는 비슷한 의미로 사용된다고 한다!

 

웹 스크래핑을 하려면 일단 외부 라이브러리를 설치해야한다. 

Python Install Package(pip)를 사용해서 라이브러리 3가지를 설치해야한다. 

 

1) dload 

2) selenium

3) bs4

 

이렇게 3가지를 설치해놓고 시작하는게 좋다.

 

 

 

2. dload 패키지 사용해보기 

 

 

url를 넣으면 바로 이미지를 다운 받게 해주는 패키지이다. 

아래 코드에 써져있는 주소는 다음 사이트에서 찾은 '고양이' 이미지 중 1개의 url이다. 

원하는 이미지를 검색했다면 이미지 위에서 마우스 우클릭 - 이미지 주소 복사를 누른 뒤 

(" ") 쌍따옴표 사이에 써주면 된다.

 

아래 코드처럼 써주기만 하면 해당 이미지가 내 컴퓨터에 저장된다. 

import dload

dload.save("https://search1.kakaocdn.net/argon/0x200_85_hr/7Qgjo3jVsBM")

 

 

 

 

 

3. selenium 패키지

 

웹 스크래핑을 할 때 파이썬으로 크롬 브라우저를 직접 제어하여 웹 페이지를 띄운 뒤 HTML을 읽어오도록 할 것이다.

그렇기 때문에 1) 브라우저를 제어할 수 있는 기능, 2) 원하는 것만 가져오는 기능! 이 두가지 기능이 필요하다.

 

이 두가지 중 selenium은 브라우저를 제어하는 패키지이다.

 

따라서 본인이 쓰는 크롬 브라우저의 정보를 알고 그에 맞는 웹 드라이버를 먼저 설치해주어야한다.

 

 

 

3-1) 셀레니움 웹 드라이버 설치하기

 

 

 3-1-1)크롬 브라우저를 띄우고 '더보기' - '도움말' - 'chrome 정보'를 클릭해서 크롬 브라우저의 버전을 확인한다.

85.0.4183.121버전으로 확인됨.

 

 

 3-1-2) 아래 링크로 들어가서 parent directory에 들어가서 버전에 맞는 것을 다운로드 받는다. 

chromedriver.storage.googleapis.com/index.html?path=85.0.4183.87/

 

 

 

 

 3-1-3) 다운 받은 파일은 작업을 원하는 폴더에 넣는다. 

 

3-2) 셀레니움 사용해보기 

 

아래 코드처럼 쓰면 자동으로 네이버로 이동한다!

이동하고 싶은 웹의 주소를 driver.get(" ") 쌍따옴표 안에 써주면 된다.

크롬 브라우저를 이용할 것이기에 크롬브라우저에 맞게 코드를 써주었다. 

from selenium import webdriver
driver = webdriver.Chrome('chromedriver')

driver.get("http://www.naver.com")

 

 

4. bs4 라이브러리

 

bs4는 beautiful soup 패키지로 html 코드를 python이 이해하는 객체 구조로 변환하는 파싱을 맡고있다.

쉽게 말해

셀레니움이 브라우저를 제어하는 기능을 제공한다면

뷰티풀 숩은 브라우저가 보고 있는 것 중에서 내가 원하는 것을 골라내는 기능을 제공한다. 

 

 

 

5. '다음' 사이트에서 고양이 이미지 검색하고 스크래핑해보기 

 

그럼 다음 사이트에서 고양이 이미지를 검색하고 검색한 고양이 이미지를 스크래핑해보자! 

스파르타코딩에서 제공해준 기본 틀을 사용했다. 

import dload
from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('chromedriver') # 웹드라이버 파일의 경로
driver.get("https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q=%EA%B3%A0%EC%96%91%EC%9D%B4")
time.sleep(5) # 5초 동안 페이지 로딩 기다리기

req = driver.page_source
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(req, 'html.parser')

###################################
# 이제 여기에 코딩을 하면 됩니다!   
###################################

driver.quit() # 끝나면 닫아주기

 

 

코딩에 들어갈 부분은 아래에 있다. 

#코딩에 들어갈 부분

thumbnails = soup.select('#imgList > div > a > img')
i = 1 
for thumbnail in thumbnails:
	img = thumbnail['src']
    dload.save(img, f'img/{i}.jpg')
    i += 1

 

 

soup.select(' ') 따옴표 안에 들어갈 부분이 내가 가져올 이미지의 샐랙터를 써주는 부분이다. 

여기가 제일 중요한데 이 부분은 각 사이트 마다 HTML을 작성하는 방법이 다르기 때문에 이것저것 넣어가며 확인해봐야한다. 

 

일단, 원하는 이미지 위에서 마우스 오른쪽 클릭 - 검사를 누른다. 

그 다음 아래 그림에서 보듯이 'Copy'를 누르고 'Copy selector'를 누른다. 

 

 

해당 고양이 이미지의 셀렉터는 아래 코드처럼 되어 있다. 

#imgList > div:nth-child(1) > a > img

 

옆에 있는 고양이는 div:nth-child(2)로 되어 있다.

그럼 여러 개의 이미지를 가져오기 위해서는 div:nth-child(1), (2) 처럼 숫자를 바꾸어서 맨 끝까지 가져오면 된다. 

그렇게 하기 위해 일단 soup.select('#imgList > div > a > img') 이렇게 셀렉터를 써준다. 

이미지의 src를 스크래핑 해주는 코드와 파이참에서의 결과를 확인해보자.

 

 

 

이제 src값들을 스크래핑 했으니 dload를 사용해서 각 이미지들을 저장해보자.

이미지를 저장하기 위해 'img'라는 폴더를 하나 만들어주었다. 

 

각 이미지들이 'img폴더'에 저장될 때 1.jpg, 2.jpg, 3.jpg처럼 숫자가 커지면서 이미지의 제목이 저장되게 하기 위해 

for in 반복문을 써준다.

 

dload.save(img, img/1.jpg) 는 img폴더에 1.jpg라는 이름으로 저장하라는 명령어인데 모든 이미지가 다 1.jpg로 저장되면 안되고 숫자가 1씩 커지게 해서 이미지의 이름을 저장해주어야 한다. 

 

따라서  i라는 변수를 만들어주고 for in반복문이 실행되는 동안 i의 값이 1씩 커지게 써준다.

 

말로 풀어쓴 내용을 코드로 적으면 아래와 같다.  

thumbnails = soup.select('#imgList > div > a > img')   #div로만 바꾸어줌.
i = 1                                                  #i변수를 만들어 줌.
for thumbnail in thumbnails:
	img = thumbnail['src']
    dload.save(img, f'img/{i}.jpg')                    #for 반복문을 써서 i를 불러옴.
    i += 1                                             #i값을 1씩 증가시켜 끝까지 찾음.

 

 

 

 6. ※전체 코드※

 

전체 코드를 보자!!!

Daum 사이트에서 고양이를 검색했고 검색된 이미지를 1.jpg, 2.jpg 형태로 내 컴퓨터 img 폴더에 저장한다! 

import dload
from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('chromedriver') # 웹드라이버 파일의 경로
driver.get("https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q=%EA%B3%A0%EC%96%91%EC%9D%B4")
time.sleep(5) # 5초 동안 페이지 로딩 기다리기

req = driver.page_source

soup = BeautifulSoup(req, 'html.parser')

thumbnails = soup.select('#imgList > div > a > img')
i = 1 
for thumbnail in thumbnails:
	img = thumbnail['src']
    dload.save(img, f'img/{i}.jpg')
    i += 1

driver.quit() # 끝나면 닫아주기

고양이 이미지가 잘 저장되었다!

고양이 이미지 스크래핑 성공!!!

 

 

 

7. beautifulsoup 내 select에 미리 정의된 다른 방법

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

 

반응형