스파르타코딩클럽에서 이벤트 강의를 진행하길래 평소에 관심있었던 웹 크롤링에 대한 강의를 수강하게 되었습니다. 과제로 내준 것이 좋아하는 연예인 사진을 스크래핑하는 것이었기 때문에 강의를 들으며 아래와 같은 코드를 짤 수 있었습니다.
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import dload
driver = webdriver.Chrome('/Users/sangminlee/sparta/chromedriver') # 웹드라이버 파일의 경로
driver.get("https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=%EB%A1%9C%EC%8B%9C")
time.sleep(5) # 5초 동안 페이지 로딩 기다리기
req = driver.page_source
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
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'/Users/sangminlee/sparta/img_homework/{i}.jpg')
i += 1
###################################
driver.quit() # 끝나면 닫아주기
코드를 하나하나 설명해보자면 우선 bs4는 웹 상에서 받아온 소스를 다루기 쉽게 해주는 패키지입니다. 그리고 selenium은 코드 상에서 우리가 브라우저를 제어할 수 있도록 합니다. Selenium을 사용하기 전에 자신이 사용하고 있는 브라우저와 버전에 맞는 웹 드라이버를 설치해줘야 하며 저 같은 경우에는 크롬 웹 드라이버를 설치해서 사용했습니다.
먼저 웹 드라이버를 이용해 브라우저를 실행해주고 경로를 입력해 해당 웹 페이지를 띄웁니다.
다음은 time.sleep(5)를 통해 브라우저가 페이지를 로딩할 때까지 기다립니다.
페이지 로딩이 끝나면 req라는 변수에 띄어진 소스 정보를 넣어주고 BeautifulSoup을 이용해 좀 더 다루기 쉬운 형태로 바꿔서 soup이라는 변수에 넣어줍니다.
이제는 soup에 저장된 값을 가지고 원하는 값을 가져올 단계입니다. HTML 코드에서 적절한 selector를 골라서 해당 selector에 해당하는 모든 태그들을 thumbnails라는 변수에 list의 형태로 저장합니다. 그 후 for문을 사용해 각 태그들에서 이미지의 url을 가져옵니다. 그리고 dload.save()를 써서 원하는 경로에 이미지들을 저장합니다.
이미지 크롤링을 해보기 전에는 마냥 어려울 것이라고 생각했지만 파이썬의 다양한 패키지들을 사용하니깐 간단하게 구현이 되는구나 싶었습니다. 확실히 이때까지 쌓여진 많은 패키지들 덕분에 요즘은 원하는 프로그램을 만들기가 쉬워진 것 같습니다.