정리

11TIL 정리(selenium)

모_아이 2022. 5. 6. 01:07

selenium

브라우저 제어

- 내가 필요한 정보를 얻기 위해 로그인, 스크롤 등의 브라우저 동작이 필요할 때 selenium을 이용하자

- 웹 스크래핑 뿐만 아니라 브라우저 제어 기능을 응용하면 정해진 시간에 게시판에 글을 작성하는 등 다양한 업무를 자동화 할 수 있다.

-bs4와 requests 만으로 스크래핑이 잘 안되는 이유가 있는데 그 둘은 스캔본을 받아서 하 듯 정적인 부분만을 가져와 스크래핑을 하기 때문이다.

-동적인 웹페이지를 스크래핑 할 때는 브라우저에 띄운 후 소스코드를 가져오는 방법을 써야하기 때문에 selenium을 사용해 보자

예시) 셀레니움 적용

from bs4 import BeautifulSoup
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome('./chromedriver')  # 드라이버를 실행합니다.


url = "https://www.melon.com/chart/day/index.htm" 
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# data = requests.get(url, headers=headers)

driver.get(url)  # 드라이버에 해당 url의 웹페이지를 띄웁니다.
sleep(5)  # 페이지가 로딩되는 동안 5초 간 기다립니다. 

req = driver.page_source  # html 정보를 가져옵니다.
driver.quit()  # 정보를 가져왔으므로 드라이버는 꺼줍니다.

tip) 특정 태그 없에기

likes_tag = song.select_one("td > div > button.like > span.cnt") #멜론에서 필요없는 부분
likes_tag.span.decompose()  # span 태그 없애기
likes = likes_tag.text.strip()  # 텍스트화한 후 앞뒤로 빈 칸 지우기

-브라우저 제어

예시) 스크롤과 버튼

from bs4 import BeautifulSoup
from selenium import webdriver
from time import sleep


driver = webdriver.Chrome('./chromedriver')

url = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query=%EC%95%84%EC%9D%B4%EC%9C%A0"
driver.get(url)
sleep(3)

req = driver.page_source # 해당 페이지를 req라는 변수에 넣기
driver.quit()

soup = BeautifulSoup(req, 'html.parser')#다음 스크래핑
images = soup.select(".tile_item._item ._image._listImage")
print(len(images))

for image in images:
    src = image["src"]
    print(src)

tip) 스크롤 내리기 /버튼 클릭하기

driver.execute_script("window.scrollTo(0, 1000)")  # 1000픽셀만큼 내리기
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") #맨 밑까지 내리기

 

btn_more = driver.find_element_by_css_selector("#foodstar-front-location-curation-more-self > div > button")
btn_more.click()#버튼을 찾아 클릭
time.sleep(5)

for i in range(10): # 10번
    try: #시도
        btn_more = driver.find_element_by_css_selector("#foodstar-front-location-curation-more-self > div > button")
        btn_more.click()
        time.sleep(5)
    except NoSuchElementException: #더이상 가져올 것이 없습니다 일시 브레이크
        break

 

-특정 카드에 id값을 집어넣기

function make_card(i, matjip) 
    let html_temp = `<div class="card" id="card-${i}">  //id값에 i번째 순서를 넣자
                        <div class="card-body">
                            <h5 class="card-title"><a href="#" class="matjip-title">${matjip['title']}</a></h5>
                            <h6 class="card-subtitle mb-2 text-muted">${matjip['category']}</h6>
                            <p class="card-text">${matjip['address']}</p>
                            <p class="card-text" style="color:blue;">${matjip['show']}</p>
                        </div>
                     </div>`;
    $('#matjip-box').append(html_temp);
}

-특정 00이 보이게 스크롤 움직이기(예시:카드)

$("#matjip-box").animate({ //애니메이션
    scrollTop: $("#matjip-box").get(0).scrollTop + $(`#card-${i}`).position().top
}, 2000); // 2000=2초 , 스크롤이 포함하고 있는 높이에서내가 선택한 카드가 있는 그 카드의 제일 위 값 그 높이

※a 태그를 클릭했을 때 새 창이 뜨는 게 아니라 javascript 함수를 실행하고 싶다면
<a href="javascriptL실행함수명()">..

 

반응형