책 쓰는 엔지니어
아이돌 사진 수 천장을 한 번에 다운로드해 보자 (3) 본문
2020/05/31 - [일반인을 위한 업무자동화] - 아이돌 사진 수 천장을 한 번에 다운로드해 보자 (1)
2020/05/31 - [일반인을 위한 업무자동화] - 아이돌 사진 수 천장을 한 번에 다운로드해 보자 (2)
이번 글의 소스코드는 깃허브에서 받으실 수 있습니다. 앞 글들을 참고하셔서 git pull origin master를 재실행주시면 폴더 안에 image_crawler 라는 폴더가 새로 생겨 있을 것입니다.
앞 글들을 읽고 오지 않으신 분들은 아래 링크에서 바로 다운로드 하시면 됩니다.
이 글은 전편에서 이어지는 글입니다.
자, 이제 크롤링을 위한 라이브러리를 설치하도록 하겠다. 필자는 예전에 셀레늄을 한 번 써 본 경험이 있는데, 이게 생각보다 쓰기 편리했다. 그래서 이번에도 셀레늄을 이용해서 문제를 풀어보도록 하겠다. 참고로 셀레늄은 원자번호 34번인 비금속 원소이다. 강력한 항산화 물질이며, 농업에서는 수경재배 시 식물에 스트레스를 가하기 위해 셀레늄을 양액에 첨가하기도 한다. 아무튼 그렇다.
오랜만에 초심으로 돌아가자. 필자가 첫 강의에서부터 강조했던 것이 있는데, 기억나는가? 바로 코딩에 있어서 가장 중요한 것은 겉멋이며 겉멋을 가장 손쉽게 부리는 방법은 바로 마우스를 쓰지 않고서 cmd창을 여는 것이다. 능숙하게 시작+r을 누른 뒤 cmd를 입력하고 엔터를 치자. 혹 이런 강력한 힘을 자주 발현하는 것이 부담스럽다면 마우스 우클릭을 통해 git bash를 열어 줘도 된다. 하지만 오늘은 가능하면 cmd창을 사용하자.
까만 창이 열렸다면 아래와 같은 명령어를 입력하자.
> pip install selenium
pip은 파이썬과 관련된 패키지를 손쉽게 설치하도록 도와주는 툴이다. 까만 창에 "pip install (패키지 이름)"을 입력하면 여러분의 컴퓨터에 패키지가 설치된다. 설치가 모두 끝났다면 cmd창에 python이라고 입력하고 엔터를 눌러보자. 파이썬 인터프레터가 실행된다. 여기에 아래 명령어를 따라 입력하자.
> import selenium
아무 일도 일어나지 않는다. 축하한다. 성공했다. 혹시 무슨 일이 일어난다면 그게 잘못된 거다. 암튼 이게 맞는 거다.
이제 크롬 드라이버와 크롬을 설치해 주자. 크롬 드라이버를 설치하면 셀레늄을 이용해 크롬 창을 제어할 수 있다. 크롬은 여기에서 다운로드할 수 있다. 크롬이 이미 설치되어 있다면 건너뛸 수 있다.
파란 버튼을 눌러 주면 크롬 설치가 시작된다. 혹시 아직도 윈도우에 기본으로 깔려 있는 iExplorer를 사용 중이라면 이번 기회에 크롬으로 갈아타는 건 어떨까?
물론 iExplorer도 굉장히 좋은 브라우저임에는 틀림없지만 워낙 뛰어난 다른 브라우저들이 많기 때문에... 심지어 마이크로소프트사에서도 인터넷 익스플로러를 개선하는 게 아니라 아예 새로운 브라우저를 출시하지 않았는가? 여담이지만 안드로이드용 엣지는 정말 명작이라고 생각한다.
여하튼 크롬이 설치되었다면 이제 크롬 드라이버를 설치하자. 아래 링크를 타고 들어가면 다운로드할 수 있다.
본인의 컴퓨터 os에 맞는 최신 버전을 다운로드하자. 압축을 풀면 윈도우를 기준으로 chromdriver.exe라는 파일이 나올 것이고, 맥은 chromdriver라는 파일이 나올 것이다. 이 파일을 저장해 두고, 그 위치의 절대 경로를 파악해 셀레늄을 사용할 때마다 입력하면 된다. 절대 경로가 무엇이냐고? 검색해 보기 바란다. 필자는 겉멋에 포함되지 않는 기본기는 가르치지 않는다.
필자는 절대 경로를 기재하는 것이 너무 귀찮아 상대 경로를 이용하기로 했다. 상대 경로가 무엇인지도 검색을 해 보고 오기 바란다. Working directory 내부에 크롬 드라이버를 옮겨 놓으면 된다. 워킹 디렉터리가 무엇이냐고? 검색해 보고 오기 바란다. 적당한 폴더를 만든 다음 그 폴더 안에 넣어 주면 된다.
자, 지금부터는 첫 강의에서 설치했던 파이참(pycharm)을 이용할 것이다. 파이참은 참 장점이 많지만 그중 가장 좋은 장점은 처음 보는 패키지의 내부를 들여다보면서 코딩하기에 용이하다는 점이다. 혹시 파이참을 설치하지 않은 독자들은 아래 링크를 통해 설치하기 바란다. 설치방법은 첫 강좌에서 설명했다.
file-open을 누르고 크롬드라이버가 들어 있는 폴더를 선택해 주자. 그리고 창 맨 하단의 "python console"이라는 탭을 누르면 짜잔! 인터프레터가 뜬다. 인터프레터에 1+1이라고 쳐 보자. 덧셈 결과가 잘 표시되는가?
처음 보는 라이브러리를 다루어야 할 때에 필자는 일단 파이참에서 파이썬 인터프레터를 켠다. 그 이유는 지금부터 알게 될 것이다. 자, 셀레늄을 불러오자. 아래 코드를 입력한다.
>>> from selenium import webdriver
위 문구는 'selenium이라는 패키지에서 webdriver라는 녀석을 골라서 걔만 불러오세요.'라는 뜻이다. 아무 일도 안 일어났다면 잘 불러와진 게 맞다. 이제 아주 약간의 코딩을 해 볼 차례다.
위의 두 줄은 이전 편에서 찾아낸, 구글 이미지에서 박효신을 검색하기 위한 링크다. 박효신이 아니라 다른 검색어로 검색하고 싶다면 search_term만 바꿔 주면 된다. 세 번째 줄은 크롬 드라이버를 이용해 셀레늄으로 크롬 창을 불러온다. 엔터를 쳐 보자. 크롬 창이 정상적으로 뜨는가? 이제 아래 명령어를 입력해 보자.
>>> browser.get(url)
크롬 창에서 사이트가 이동된다. browser.get(url)은 url이라는 주소를 주소창에 입력한 결과를 보여준다. url에 "http://bhban.tistory.com"이라고 입력했다면 필자의 블로그 페이지로 이동했을 것이다. 자, 몇 번 연습을 해 보길 바란다. 여러분은 이제 셀레늄을 이용해 웹페이지에 접속하는 방법을 깨우쳤다. 예전에 유행했던 싸이월드 미니홈피가 아직 살아 있었다면 '셀레늄을 이용해 미니홈피 조회수 올리는 방법' 따위의 강좌를 썼을 텐데 아쉽다. 이제 다시 아까 켜 뒀던 개발자 도구로 돌아가자.
빨간 동그라미를 클릭하고 사진 위에 마우스 커서를 올려 보자. 위에 뭐라고 적혀 있다.
사진 영역만 확대해 보았다. 이제 위 문구를 분석해 보자. 맨 뒤에 있는 "312x159"는 이미지의 크기일 것이다. 가로로 312픽셀, 세로로 159픽셀짜리 이미지라는 뜻인 것 같다.
img는 image의 줄임말일 것이고, 아마 저 마우스 커서가 올라가 있는 영역이 이미지의 일종이라는 뜻일 것이다. 뒤에 있는 주황색 해시태그는 마우스 커서를 이리저리 옮겨 보면, 사진마다 모두 다른 값을 갖고 있음을 알 수 있다. 사진마다 가지는 일종의 고유한 값일 것이다. 그리고 모든 이미지들이 뒤에 공통적으로 ".rg_ic.rg_i"라는 문구를 포함한다. 파이썬 같은 경우에는 어떤 클래스 하위의 메서드나 정보를 가져올 때 '.'을 사용한다. 저 문구는 느낌상 rg_ic에 포함된 여러 가지 기능이나 정보 중 rg_i라는 정보를 가져온다는 뜻인 것 같다.
물론 필자의 추측이 정답이 아닐 수도 있다. 아니면 다른 방법으로 고민해 보면 되지 않은가. 개발자는 문제를 해결하는 사람이다. 매번 모든 문제의 정답을 알고 있을 수는 없다. 모르는 문제의 답을 찾아가는 데에는 방법이 하나만 있는 것이 아니다.
느낌적인 느낌으로는, 셀레늄을 이용해 "rg_ic"라고 표기된 영역을 찾아내는 것이 먼저일 것 같다. 이 영역을 찾아낼 수 있으면 저장도 할 수 있고, 이걸 반복할 수 있으면 우리의 목표가 달성될 것 아닌가? 브라우저에서 어떻게 이 영역을 찾을 수 있는지 한번 힌트를 찾아보자. 아래 명령어를 파이참 인터프레터에 입력한다.
browser.
browser는 아까 우리가 불러온 크롬 드라이버를 제어하는 녀석이고, 그 뒤에 '.'을 하나 찍으면 그 하부 기능들을 불러올 수 있다. 파이참에서는 '어떤 기능을 불러오시려고요?'라며 친절하게 메뉴판을 건넨다. 아래 그림과 같이 말이다.
하위 기능들을 죽죽 내려보자. find_element 어쩌고 저쩌고 시리즈들이 나오는데 이걸 쓰면 아마 'rg_ic'라고 적힌 정보를 쉽게 찾을 수 있을 것 같은 느낌이 든다. 파이참이 이렇게 좋다. 셀레늄 사용설명서를 찾아보지 않아도 눈치로 대충 때려 맞출 수 있지 않은가. 위에서부터 하나씩 건드려 보기로 했다. 그런데 일단은 인자를 하나만 넣어 주어도 되는 녀석으로 골라 보고 싶었다. 그래서 위에서 name이라는 인자만 입력받는 find_element_by_class_name()을 사용해 봤는데, 결과적으로 잘 얻어걸렸다. 역시 rg_ic가 클래스 이름이 맞나 보다.
rg_ic가 클래스 이름이 맞나 보다. 결과를 보니 finid_elements_by_class_name() 은 클래스 이름이 일치하는 모든 요소를 찾아오나 보다. 구글 이미지 검색 창에서 돌려보면 딱 100개의 엘레멘트가 긁혀 나온다. 이 중에 하나를 가져와 b라고 이름 붙였다. 좀 더 둘러보기 위해서.
b는 셀레늄 웹 드라이버 밑에 있는 어떤 객체인 것 같다. 뒤에 뭐라 뭐라 길게 정보가 적혀 있는데 저건 봐도 모르겠다. 일단 만능 키워드인 '.'을 눌러보자.
사용 가능한 메서드가 생각보다 많다. 이 중 맨 위에 screenshot()이라는 메서드가 있다. 이거 쓰면 바로 되는 거 아닐까?
스크린샷을 호출했다. filename이라는 파라미터에는 저장할 파일 이름을 적어주면 되는 것 같아서 우선 'test.png'라고 입력했다. 결과로 True가 리턴되는데, 아마 스크린샷 저장에 성공했다는 뜻인 것 같다.... 람쥐!
성공했다. 이미지가 저장되었다. 셀레늄을 하나도 모르는데도 일단 이미지를 하나 긁어오는 데 성공한 것이다. 이제는 반복문을 이용하면 모든 것이 끝날 것이다. 이제 엔드게임(endgame)으로 들어간다.
간단하게 반복문을 짰다. enumerate가 무엇인지는 검색해 보고 오길 바란다. 사진을 다 긁어오면 브라우저가 종료 되도록 했다. 자, 눈을 질끈 감고 엔터키를 눌러보자.
동영상과 본문에 사용된 코드가 약간 다르게 생겼다. 영상에서는 인터프레터창에서 그냥 이어서 코드를 짠 것이고, 본문 코드는 이해하기 쉽게 약간 정리한 것이다. 여하튼 잘 작동한다. 폴더를 열어보자.
사진이 잘 저장되었다. 그런데 결과가 100개뿐이라 아쉽다. 구글은 스크롤을 내리기 전에는 우선 100개의 이미지를 공개하고, 스크롤을 내릴 때마다 더 많은 검색 결과를 로드한다. for 문을 돌리기 전에 스크롤을 여러 번 내려 주면 더 많은 검색 결과를 받을 수 있다는 뜻이다. 아래 코드를 이용하면 셀레늄 크롬 드라이버의 스크롤을 내릴 수 있다.
완성된 코드는 이렇게 생겼다.
두근두근. 기대되는 마음으로 코드를 실행한다. 400개의 이미지가 저장되었다! 그런데 큰 문제가 하나 있다. 대부분의 사진이 아래와 같은 상태다.
60여 개까지는 이미지가 잘 다운로드되지만, 그 뒤로는 대부분의 사진이 백지로 나온다. 무엇이 문제일까?
다시 개발자 도구로 들어가 다운로드되지 않았던 후순위 사진들을 검사해 본다. 좌측부터 보자. 위에 있었던 사진들과 달리 후순위 사진들은 주황색으로 된 해시태그가 삭제되어 있다. 오른쪽을 보면, data-src 영역과 src 주소에 encrypted-tbn0.~~이 포함되어 있다.
다른 사진들도 마찬가지다. 즉, 구글 이미지 검색은 처음 몇 개의 이미지를 제외한 다른 이미지는 주소를 암호화하여 보호하고 있다. 우리 같은 열성팬들이 손쉽게 대량의 자료를 긁어가는 것을 방지하기 위해서이다.
아마 위와 같은 목적일 것이다. 검색 결과는 그 회사의 밥줄이므로. 구글은 일일이 ip를 차단하는 대신, 대량의 자료를 긁어가는 것 자체를 방지하는 쪽으로 운영되고 있는 것이다.
쉬운 회피 방안을 알려주고 마무리하겠다. 미리 대량의 검색어를 준비해 두면 된다. 예를 들면 (박효신, 효신, 대장 나무)라는 3개의 키워드와 (노래, 얼굴, 콘서트, 직캠, 공연) 5개의 키워드를 준비한다. 이 중 왼쪽 키워드와 오른쪽 키워드를 한 개씩 골라 새로운 검색어를 만들면 총 15개의 검색어 조합을 만들 수 있다. 이 15개의 검색어를 for문을 이용해 번갈아가며 검색하고, 상위 검색 결과 60개씩만 긁어 오는 것이다. 좌측에 n개, 우측에 k 개라는 검색어를 준비하면 n * k * 60개의 이미지 검색 결과를 기대해 볼 수 있게 된다. 만약 걸그룹이나 보이그룹 관련 내용을 검색하고 싶다면 멤버 이름을 하나하나 미리 지정해 두는 것으로 더욱 쉽게 조합을 탄생시킬 수 있다. 이런 식으로 말이다.
검색어를 조합하여 긁어오는 방식
정말로 구글에서 ip차단을 시도한다면 이런 방법을 사용할 수 없겠지만, 당장 아이돌 사진을 구할 수 있다면 그게 대수겠는가?
그런데, 구글에서 차단한 저 기능을 우회해서 사진을 크롤링하는 방법이 있다. 이 방법을 사용하면 이미지 사이즈도 줄어들지 않는다. 다운로드할 이미지의 개수도 제한이 없다. 이미지 검색 결과에 있는 모든 이미지를 긁어와도 정상 작동하더라. 대량의 고화질 원본 이미지를 IP 차단당하지 않으면서 크롤링하는 방법은 '생능출판사'를 통해 출간될 업무 자동화 책에서 소개한다. 한창 원고 작업중이다. 출시일정은 출판사로 문의 바란다.
'일반인을 위한 업무자동화' 카테고리의 다른 글
[신간안내] 6개월치 업무를 하루 만에 끝내는 업무 자동화 (3) | 2020.12.21 |
---|---|
트위터, 인스타그램 자동화 예제 (0) | 2020.06.19 |
키보드, 마우스를 자동으로 움직이는 매크로 (1) | 2020.05.31 |
사진 수 천 장을 인스타그램에 올리기 좋게 편집하기 (0) | 2020.05.31 |
아이돌 사진 수 천장을 한 번에 다운로드해 보자 (2) (0) | 2020.05.31 |
아이돌 사진 수 천장을 한 번에 다운로드해 보자 (1) (0) | 2020.05.31 |
수 천 개의 텍스트 파일을 엑셀 하나로 합쳐 보자(2) (0) | 2020.05.31 |
수 천 개의 텍스트 파일을 엑셀 하나로 합쳐 보자(1) (0) | 2020.05.31 |