몇 달 전부터 가족에게 부탁받은 일이 있었다.
특정 분야 업체들의 정보를 모아달라는 것이었는데, 그 동안 계속 미루고 미뤄왔다.
그 이유는 다음과 같다.
- 시간 및 심적 여유가 없었음
- 손으로 하나하나 하기엔 나는 비효율적인 반복 작업을 정말 싫어함
- 반복 작업을 피하기 위해선 파이썬을 써야 한다는 것을 알고 있음
할 줄 아는 언어라고는 자바 뿐인 나에게, 파이썬에 도전한다는 것은 큰 각오와 많은 시간을 필요로 하는 일이었다.
그런데 마침 월급을 몇 달째 주지 않는 이 회사를 떠날 날이 얼마 남지 않아 시간이 생겼다. (심적 여유는 여전히 없지만🙃)
그래서 개인 프로젝트 들어가기 전에 한번 도전해보려고 한다!!!
나는 IntelliJ IDEA를 사용하므로 여기에 맞춰 작성하겠다.
https://www.python.org/downloads/
위 링크에서 자기 환경에 맞는 버전을 다운받으면 된다.
나는 Windows 64bit라서 위 사진에서 Windows 클릭 후
여기서 64bit 선택해서 다운받았다.
다운 받은 파일을 실행하면
이런 화면이 뜨는데, 나는 체크박스 1번은 선택 안하고 2번만 선택한 후 설치 진행했다. (지금 보니 권장한다고 되어있는 걸 보면 1번도 체크 하는게 나았을지도...)
설치가 잘 되었다면 cmd에서 아래 명령어를 입력해 확인해보자
python --version
파이썬 버전이 잘 표시된다면 성공한 것!
설치한 파이썬을 인텔리제이에서 써먹기 위해서 플러그인을 설치해주어야 한다.
File -> Settings으로 들어가보면 왼쪽 메뉴에 플러그인이 있는 것을 확인할 수 있다.
마켓플레이스의 검색창에 python을 검색해 다운받자.
(나는 이미 설치해놔서 오른쪽 체크박스가 뜨는데, 원래는 설치 버튼이 있다.)
플러그인 설치 후에는 꼭 인텔리제이를 재기동해주자!
다 했다면 이제 새 파이썬 프로젝트를 만들 것이다.
File -> New -> Project 클릭하면 아래와 같이 뜬다.
왼쪽에서 파이썬 선택 후 이름과 프로젝트 경로를 설정해준다.
환경 타입은 Virtualenv로 선택하는게 좋다고 한다.
가상 환경을 만들어 파이썬 프로젝트의 환경을 개별적으로 구성해줄 수 있다는 듯 하다.
인터프리터는 아까 설치한 파이썬을 선택하면 된다!
프로젝트 및 파이썬 파일 생성 후 print("Hello World") 를 입력해 잘 돌아가는지 확인해보자~!
여기서 나는 조금 애를 먹었다.
pip install selenium
이게 셀레니움 설치 명령어인데, 처음엔 cmd 창에서 설치해보고, 그 다음엔 인텔리제이 터미널에서 설치해봤는데 경로가 맞지 않는건지 둘 다 돌아가질 않았다. 그래서 내가 한 방법은 다음과 같다.
프로젝트 우클릭 -> Open Module Settings -> 왼쪽 SDK 클릭
-> 파이썬 선택
선택하면 오른쪽에 클래스 경로 / 패키지가 있는데 패키지를 클릭해보자.
만약 여기에 selenium이 있다면 이미 잘 설치가 된 상태지만, 없다면 클래스 경로 밑에 보이는 + 버튼을 누르자.
여기서 셀레니움을 검색, 선택해 패키지 설치를 진행한다.
설치가 잘 되었는지 확인해보자!
import selenium
print(selenium.__version__)
파이썬 파일에 위 코드를 넣고 실행하면
이렇게 버전이 뜬다!!
원래는 Chrome Webdriver를 설치해서 또 뭐 설정을 해줘야 한다는데, 셀레니움 4.x 버전 이상은 webdriver_manager를 설치하면 알아서 되는 모양이다.
그래서 인텔리제이 터미널에
pip install webdriver_manager
이 명령어를 넣고 실행하면
코드가 와르르 뜨며 마지막에 위와 같이 성공적으로 설치했다는 멘트가 뜬다!
이 정도면 설치 끝~!! 가장 어려운 걸 해냈다!!
import 해둔 부분에 자꾸 빨간 줄이 뜨긴 하지만 잘 굴러간다!
우선 상단에 여러가지 임포트를 해주어야 한다.
위에 언급한 webdriver_manager도 필요하니 다음과 같이 작성해준다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
# webdriver_manager 통해 driver 설정
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
그리고 크롤링 하고자 하는 링크를 다음과 같이 작성한다.
검색어도 키워드에 적어준다.
# 네이버 지도 링크
driver.get("https://map.naver.com/p/search")
keyword = "카레 맛집"
크롤링은 사람이 손으로 하나하나 해야할 일을 컴퓨터가 대신 해주는거고, 그러기 위해선 컴퓨터가 알아듣도록 지정을 해주어야 한다.
예를 들어 우리가 무언가 검색을 할 때
- 검색창을 클릭한다.
- 검색어를 입력한다.
- 엔터를 누른다.
- 검색 결과 중 하나를 클릭한다.
뭐 이런 일련의 과정이 있을 것이다.
그것들을 하나하나 코드로 지정해주는거다.
사람이 사용하는 방식 그대로 컴퓨터가 움직이도록 말이다!
# 검색창 찾기
search = driver.find_element(By.CSS_SELECTOR, 'div.input_box > input.input_search')
search.send_keys(keyword) # 검색어 입력
search.send_keys(Keys.ENTER) # 엔터버튼 누르기
위 코드가 그렇다. 검색창을 찾고, 검색어를 입력하고, 엔터를 누른다.
당연한 말이겠지만 사이트마다 코드 구조나 각 요소의 아이디 등이 다를 것이다.
각자의 상황에 맞춰 코드를 작성해야 한다.
갑자기 여기서 이렇게 애매하게 작성하고 고작 120줄의 코드를 올리지 않는 것은...
작업 도중 엄청난 사실을 알게 되었기 때문이다.
테스트 삼아 작성한 코드를 한 두번씩 돌려보면서 작업을 했다.
그런데 어느 시점으로 가니 속도가 눈에 띄에 느려지기 시작했다.
코드에 문제가 있나 싶어서 제미나이에게 물어봤는데...
세상에, 알고 보니 크롤링은 웬만해선 허용되지 않는단다..!!!
허용 범위는 각 사이트의 robots.txt를 보면 알 수 있다고 한다. 네이버 지도의 robots.txt는 다음과 같다.
User-agent: * -> 모든 종류의 로봇(크롤러)에게 적용
Disallow: / -> "/"는 웹사이트의 모든 경로를 의미. 기본적으로 모든 페이지의 크롤링을 금지
Allow: /$ -> 정확히 루트 주소로 끝나는 경우는 허용. 여기서 $ 는 '문장의 끝'을 의미하는 정규식 기호로, / 뒤에 아무것도 오지 않는 경우.
Allow: /p/$ -> 정확히 /p/로 끝나는 주소만 허용.
Allow: /v5/$ -> 정확히 /v5/로 끝나는 주소만 허용.
내가 크롤링을 시도했던 링크는 https://map.naver.com/p/search 였기 때문에 /p/로 끝나지 않고 뒤에 search가 붙기 때문에 금지된다고 제미나이가 알려주었다. (작업 내내 지피티에게 물어봤었는데 이런건 알려주지 않았다😥)
비상업적으로 이용하든 공부하기 위해서든, 크롤링은 해서는 안된다는 것을 새로 배워가며,,,
결국엔 미완성된 크롤링 코드는 다시 돌리지 않고 손으로 하나하나 작업했다.
그래도 한번 시도해봐서 대충 크롤링 과정이 어떤 방식으로 굴러가는지 알게 되었다.
마치 코드로 굴러가는 오토핫키 같다고 느꼈다.
그리고 파이썬도 처음 써봤는데, 세미콜론이나 자료형을 쓰지 않아도 돼서 조금 이상하고 신기했다.
다른 언어를 할 줄 아는 사람이라면 파이썬은 금방 배울 것 같은.. 그런 느낌이었다.
다음엔 다른 프로젝트에 파이썬을 써보고 싶다! (합법적인걸로!!)
나는 정말 쫄보 중의 쫄보라서 중간에 정말 간 떨어지는 줄 알았지만, 그래도 새로운 것을 많이 배워가는 2일이었다.
이렇게 작성해두었던 글을 한 달이 훌쩍 지난 이제서야 올린다.
여전히 밀린 월급은 못받았고, 해결되지 않은 일도 많지만...
분명 하나씩 해결될거고, 난 더 좋은 회사로 갈거라고 믿는다!!!