이전 포스팅
2022.10.19 - [개발 공부 시리즈/수익형 웹앱 만들기] - 수익형 웹&앱 만들기 기본지식 (1) - 파이썬 설치 및 크롤링
※ 이 포스팅은 조코딩님의 유튜브 강의를 참고하여 작성한 포스팅입니다.
출처 : https://www.youtube.com/watch?v=1b7pXC1-IbE
파이썬 셀레니움(Python Selenium)
이전 포스팅에 이어서 파이썬 셀레늄을 사용한 크롤링을 해보고자 한다.
이전 포스팅에서는 크롤링을 위해 BeautifulSoup 라이브러리를 이용하여 크롤링하였다.
하지만
BeautifulSoup 라이브러리는 Javascript로 동적으로 생성된 정보는 가져올 수 없다는 한계점이 있다.
셀레니움을 사용하면 브라우저를 코드로 조작하기 때문에 인터넷 브라우저의 동작 방식과 똑같이 동작할 수 있다.
우리가 브라우저를 통해 볼 수 있는 정보들은 무조건 크롤링이 가능하다.
셀레니움의 또 다른 기능은 메일 보내기 등 우리가 브라우저로 할 수 있는 기능들은 모두 다 자동화할 수 있다.
파이썬 가상 환경 세팅
파이썬 가상환경은 파이썬의 버전이나 종류들을 여러 개로 나누어 각각 독립적으로 만들어 선택하여 사용할 수 있다.
하나의 파일만 실행하는 것이 아닌 여러 개의 독립적인 공간으로 나누는 것이다.
사용하는 이유는 각각 사용되는 패키지들의 버전에 따라 맞춰줘야 하는 문제가 생기기 때문에 이런 독립적인 환경을 나누는 것이다. 그래서 자신이 원하는 프로젝트와 버전을 선택하여 사용할 수 있다.
이번 포스팅에서는 python venv 를 설치하여 가상 환경을 세팅할 것이다.
1. 우선 자신이 작업할 디렉토리를 선택하여 vsCode를 열어준다.
나는 selenum이라는 폴더를 만들고 vsCode를 열어주었다.
2. python venv를 사용하여 가상 환경을 세팅해준다.
https://docs.python.org/ko/3/library/venv.html
파이썬 공식 문서에 들어가면, 다음과 같은 명령어로 가상 환경을 만들 수 있다고 나와있다.
두 번째 명령어로 실행해준다. 가상 환경 이름은 아무것으로 해도 상관없다.
#원래는 공식문서의 명령어 뒤의 경로는 가상환경을 생성할 경로이다.
#python3 -m venv /path/to/new/virtual/environment
#변경된 명령어 우리는 지금 vsCode로 폴더안쪽에 있으니 selenium 이라는 이름의 가상환경을 만든다.
python -m venv selenium-py
vsCode에 이 명령어를 넣어준다. 터미널 열기는 (Ctrl + `)를 눌러주면 된다.
명령어를 입력하면 현재 폴더 아래에 selenium-py라는 폴더가 생성된 것을 확인할 수 있다.
생성된 폴더에 현재 디렉터리에서
다음과 같은 명령어를 순차적으로 입력해주면 가상 환경이 실행된다.
cd selenium/Scripts
activate
문제 발생
나는 activate 명령어를 입력했지만 실행이 되지 않았다.
해당 오류의 해결 방법을 찾아보았더니 터미널이 powershell 인경우 해당 명령어가 수행되지 않는다.
vsCode 오른쪽 하단에 터미널을 command Prompt로 변경해준다.
그리고 다시 위에서 실행하는 명령어로 activate 하면 다음과 같이 실행되는 것을 볼 수 있다.
이 화면은 가상 환경 자체가 실행되고 있는 상태이다.
이 환경에서 패키지를 설치한다면 이 가상환경 내에서 설치되고 실행되는 것이다.
독립적인 공간을 유지할 수 있다.
3. 가상 환경 내에 selenium 설치하기
다음의 명령어로 가상환경내에 selenium을 설치해준다.
pip install selenium
4. selenium을 활용할 웹 브라우저 세팅
https://chromedriver.chromium.org/
현재 나의 크롬 버전을 확인한다. 크롬 버전은 크롬 상단의... 을 클릭하고 도움말 > chrome 정보를 클릭하면 볼 수 있다.
이 버전에 맞는 크롬 드라이버를 다운로드하면 된다. 위 사이트 다운로드 탭으로 간 다음 106 버전을 다운로드한다.
이 파일을 다운로드하고, 압축을 풀면 chromedriver.exe 파일이 생성되고, 이 파일을 vsCode에 selenium-py 폴더 안에 넣어준다.
그리고 이 폴더안에 google.py라는 파일을 만들어준다. chromedriver.exe와 같은 경로에 있어야 한다.
여기까지 기본적인 세팅이 끝났다.
5. google.py 작성
google.py를 다음과 같이 작성한다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
#다운받은 chorme드라이버를 driver 변수에 담는다.
driver = webdriver.Chrome()
driver.get("http://www.python.org")
# assert "Python" in driver.title
# elem = driver.find_element(By.NAME, "q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()
selenium-py 폴더로 이동 후 google.py를 실행해준다.
명령어를 실행해주면 파이썬 홈페이지가 열리고 Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.
라고 보인다.
위의 코드를 사용하여 크롬 브라우저 위에서 동작하게 되는 것이다.
google.py의 내용을 다음과 같이 변경한다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
#경로 변경
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# assert "Python" in driver.title
# elem = driver.find_element(By.NAME, "q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()
6. 이미지 검색 자동화
구글을 띄워 이미지를 검색하기까지를 코드로 구현해보겠다.
개발자 도구(F12)를 열어 구글 검색창의 속성 값을 사용해야한다. name="q" 인 속성값을 이용할 것이다.
google.py를 다음과 같이 작성하고 실행해보자.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
창을 띄우고 자동으로 풍선이라는 검색어를 입력한 것을 확인할 수 있다.
이제 엔터키 입력까지 구현해야 한다.
맨 아래 #엔터키 입력 아래에 있는 코드를 추가해준다. 그리고 실행해준다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
# 엔터키 입력
elem.send_keys(Keys.RETURN)
자동으로 이미지를 검색하는 것을 볼 수 있다.
7. 이미지 다운로드 자동화
개발자 도구를 통해 이미지들을 보면 공통적으로 rg_i Q4 LuWd라는 클래스를 가지고 있다.
google.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
# 엔터키 입력
elem.send_keys(Keys.RETURN)
#이미지 엘리먼트 선택 및 클릭
driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")[0].click()
다음과 같이 변경하고 실행하면 이미지를 검색하고 첫 번째 요소까지 선택한 것을 확인할 수 있다.
이제는 이미지를 다운로드하는 것까지 구현해보겠다. 이미지 태그의 클래스 요소와 이미지 태그의 src 요소를 알 수 있으면 다운로드할 수 있다.
google.py의 코드를 다음과 같이 추가한다 설명은 주석으로 써놓았다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib.request
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
# 엔터키 입력
elem.send_keys(Keys.RETURN)
#이미지 엘리먼트 선택 및 클릭
driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")[0].click()
#3초지연
time.sleep(3)
#선택한 큰 이미지 선택후 src 주소 선택
imgUrl = driver.find_element(By.CSS_SELECTOR, ".n3VNCb").get_attribute("src")
#이미지 다운로드
urllib.request.urlretrieve(imgUrl, 'test.jpg')
이렇게 작성하고 실행한다. 이미지가 정상적으로 다운로드하여진 것을 확인할 수 있다.
8. 이미지 반복문으로 다운로드
googly.py의 내용을 반복문으로 변경하여 이미지를 자동으로 여러 개 다운로드하도록 코드를 변경하였다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib.request
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
# 엔터키 입력
elem.send_keys(Keys.RETURN)
#이미지 엘리먼트 선택 및 클릭
images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")
count = 1
#이미지 반복문
for image in images:
image.click()
#3초지연
time.sleep(3)
#선택한 큰 이미지 선택후 src 주소 선택
imgUrl = driver.find_element(By.CSS_SELECTOR, ".n3VNCb").get_attribute("src")
#이미지 다운로드
urllib.request.urlretrieve(imgUrl, str(count) + '.jpg')
count = count + 1
실행해보면 이미지가 자동으로 다운로드하여지는 것을 확인할 수 있다.
이미지는 최대 맨 처음 이미지를 불러오는 개수로 설정되어있고 스크롤 페이징으로 구성돼 있기 때문에
스크롤을 내리면서 다운로드하여야 그 이상 다운로드할 수 있다.
다음과 같이 class가 아니라 XPath로도 좀 더 구체적으로 요소를 찾아낼 수 있다.
google.py를 다음과 같이 변경한다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib.request
# 크롬 웹 드라이버를 연다.
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=en&ogbl")
# 구글 검색창 찾기
elem = driver.find_element(By.NAME, "q")
# 구글 검색어
elem.send_keys("풍선")
# 엔터키 입력
elem.send_keys(Keys.RETURN)
#스크롤 시간 설정
SCROLL_PAUSE_TIME = 2
# Get scroll height
# execute_script : javascript 를 실행하는 코드
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom
# 브라우저 끝까지 스크롤 내린다.
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
# 0.5초 동안 기다림
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
#이전과 내린 스크롤의 높이가 같다면
if new_height == last_height:
try:
#결과 더보기 버튼이 있으면 클릭
driver.find_element(By.CSS_SELECTOR, ".mye4qd").click()
except:
break
last_height = new_height
#이미지 엘리먼트 선택 및 클릭
images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")
count = 1
#이미지 반복문
for image in images:
try :
image.click()
#3초지연
time.sleep(2)
#선택한 큰 이미지 선택후 src 주소 선택
imgUrl = driver.find_element(By.CSS_SELECTOR, "#Sva75c > div > div > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div > div.OUZ5W > div.zjoqD > div.qdnLaf.isv-id.b0vFpe > div > a > img").get_attribute("src")
#이미지 다운로드
urllib.request.urlretrieve(imgUrl, str(count) + '.jpg')
count = count + 1
except :
pass
driver.close()
이와 같이 작성하면 스크롤 및 이미지 다운로드를 자동화할 수 있다.
'개발 공부 시리즈 > 수익형웹앱만들기' 카테고리의 다른 글
안드로이드 스튜디오 다운로드 및 환경 설정 (0) | 2022.11.08 |
---|---|
수익형 웹&앱만들기 기본지식 (1) - 파이썬 설치 및 크롤링 (1) | 2022.10.19 |
댓글