본문 바로가기
Python

파이썬 동적 크롤링

by 승환파크 2023. 5. 11.

우선 자신이 사용하는 웹 브라우저에 맞는 드라이버를 다운받기.

(필자는 크롬 브라우저를 사용하기 때문에 크롬 드라이버를 설치함)

 

이후 selenium 라이브러리를 설치한다.

pip install selenium

 

selenium 라이브러리를 설치한 이후 파이썬에 import 하기

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from urllib.request import urlopen

 

 

selenium 으로 DOM에 접근하는 방법

  • 단일 객체 반환(bs4 - BeautifulSoup 의 find()와 같은 형태)
    • find_element
  • 리스트 객체 반환(bs4 의 find_all()과 같은 형태)
    • find_elements

 

driver를 사용해서 웹 접속하기

url = "https://www.naver.com"

driver = webdriver.Chrome("chromedriver")

driver.get(url) # url 접속

코드를 실행하면 새로운 웹 브라우저가 실행된다.

 

CSS_SELECTER

bs4의 select() 와 동일한 동작을 수행한다.

url = "https://pjt3591oo.github.io"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

selected = driver.find_element(by = By.CSS_SELECTOR, value = "div.p")
print(selected)
print(selected.tag_name)
print(selected.text)
# 결과값
# <selenium.webdriver.remote.webelement.WebElement (session="3ae1f5f8b747ab2624d6d73973b3d77d", element="01818C168FC6EE24A7D1192F0007F7F4_element_3")>
# div
# [programming] [react] react 작업환경 설
# react를 시작하기 전에 환경셋팅을 해보자
# 2017-05-20 06:29:05 +0000   |   박정태

 

 

없는 요소 접근

bs4와는 다르게 없는 요소에 접근을 하려고 시도하면 에러가 발생한다.

driver.find_element(By.CSS_SELECTOR, ".a")
# 결과값
# NoSuchElementException: Message: no such element: Unable to locate element:

 

 

웹 제어

1. 마우스 제어

url = "https://pjt3591oo.github.io"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

selected = driver.find_element(By.CSS_SELECTOR, "div.p a")
print(selected)
print(selected.text)

selected.click()
# 결과값
# <selenium.webdriver.remote.webelement.WebElement (session="e972a42c3d9337bfe0ea69c0604a8dde", element="3AAF2EFEAF5472376F4E12DF97033A13_element_20")>
# [programming] [react] react 작업환경 설

클릭 메서드 사용시 주의점

url = "https://pjt3591oo.github.io"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

selected = driver.find_elements(By.CSS_SELECTOR, "a")

for i in selected:
    print(i.text, i.tag_name)
    i.click()

# 코드가 처음에는 잘 작동하다가 에러가 발생한다

메인 페이지에서 돔트리를 불러온 이후 다른 페이지로 넘어가면 그 전의 페이지는 사용할 수 없게 된다.

따라서 click을 페이지 이동 용도로 사용하는 것은 가급적 피하는 것이 좋다.

페이지 변화 없이 페이지 내에서 데이터가 변화되는 경우에 사용하는 것을 권장 한다.

 

2. 키보드 제어

url = "https://pjt3591oo.github.io/search"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

selected = driver.find_element(By.CSS_SELECTOR, "input#search-box")

selected.send_keys("test")

특수키 입력

from selenium.webdriver.common.keys import Keys
# 특수키 입력
url = "https://pjt3591oo.github.io/search"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

selected = driver.find_element(By.CSS_SELECTOR, "input#search-box")

selected.send_keys("test")
selected.send_keys(Keys.ENTER)

soup = BeautifulSoup(driver.page_source, "lxml")
items = soup.select("ul#search-results li")

for i in items:
    title = i.select_one("h3").text
    description = i.select_one("p").text
    print(title)
    print(description)

 

selenium과 bs4의 조합

page_source : 현재 웹 브라우저의 HTML 코드를 가져온다.

url = "https://pjt3591oo.github.io/search"

driver = webdriver.Chrome("chromedriver")

driver.get(url)

soup = BeautifulSoup(driver.page_source, "lxml")

print(soup.select("div"))

'Python' 카테고리의 다른 글

파이썬으로 MySQL 연동하기  (0) 2023.05.26
파이썬 정적 크롤링  (0) 2023.05.10
파이썬 웹 크롤링  (1) 2023.05.10
파이썬 상속  (0) 2023.05.10
파이썬 프라이빗 변수와 getter, setter  (1) 2023.05.10