파이썬에서 사용할수있는 Parser의 종류중 하나입니다
BeautifulSoup를 사용하기 위해선 라이브러리 설치가 필요합니다
pip install beautifulsoup4
이제 Beautifulsoup을 사용해봅시다
일단 테스트 사이트를 요청하여 응답받아줍니다
import requests
res = request.get("http://www.example.com")
요청 할 때 사이트의 주소를 전부 적어줘야합니다 http:// 를 생략할경우 정상적으로 작동하지 않을수있습니다
from bs4 import BeautifulSoup
soup = BeautifulSoup(res.text, "html.parser")
간단하게 파싱이 되었습니다
이제 soup.요소 또는 soup.find(”요소”)를 하면 해당 요소를 가져올 수 있습니다
하지만 이러한 방법으로는 제일앞에있는 요소 하나밖에 가져올수 없습니다
여러개의 요소를 가져오고싶을경우는
soup.find_all(”요소”)를 하면 해당 요소를 배열에 담에 전부 리턴합니다
soup.find(”요소”)[”속성”]을 한다면 해당 속성에 들어있는 값을 가져올수도 있습니다
태그는 자신의 이름뿐만 아니라 고유속성 또한 가질수 있습니다
이중 id와 class 는 Locator로써 특정 태그를 지칭하는데 사용합니다
<p id="target" class="targets"> target!</p>
Locator를 사용하면 beautifulSoup에서 더 효과적으로 태그를 찾아갈수 있습니다
p태그 중 id가 target인 태그를 찾는다
soup.find("p", id="target")
find에 기존과 같이 태그를 적고 뒤에 , id=”id명”을 적어주면 id명을 가진 태그를 찾을수 있습니다
이번엔 p태그중 class가 targets인 태그를 찾아보겟습니다
soup.find("p", "target")
이번엔 id=이 제거되고 바로 “class명”만 넘겨주는 형태가 되었습니다
페이지네이션(Pagination) 많은 정보를 인덱스로 구분하는 기법입니다
쉽게 말해 웹사이트 글 목록에서 볼 수 있는 페이지들을 말합니다
페이지네이션 기법으로 만들어진 여러 페이지들의 정보를 가져오기위해선 원하는 페이지 만큼을 순회 해야 됩니다
보통 Query String을 이용하면 이용하면 이를 해결 할 수 있습니다
쿼리 스트링이란
https://testpage.co.kr/?page={i}
이 코드의 ?뒤에 page={i} 부분을 말합니다
이는 testpage.co.kr 에 page라는 key로 i라는 value를 보내겟다는 것으로
i번째 페이지를 열겟다는 의미를 가질수 있습니다
이를 for문을 이용해서 돌리면 원하는 페이지만큼의 데이터를 긁어올수 있습니다
하지만 여기서 그냥 for문을 돌린다면 프로그램은 엄청난 속도로 요청을 보낼 것이며 이것은 요청받는 서버에 굉장한 부담을 줄 수 있습니다
이를 해결하기위해
import time
을 사용합니다
for문 내부에 time.sleep(초)를 입력하면
입력한 초 만큼의 딜레이를 걸어 줄 수 있습니다
정적 웹사이트는 html문서가 완전하게 응답이 되기 때문에 대부분의 정보를 가져올수 있지만
동적 웹사이트는 html이 랜더링이 될 때까지의 지연시간이 존재합니다 이는 응답을 바로 받아온다면 원하는 데이터가 존재하지 않을수 있습니다
BeautifulSoup만으로는 해결이 방법이 부족하지만 이를 해결하기 위한 제일 간단한 방법은 파이썬으로 브라우저를 대체하는것이 아닌 브라우저를 파이썬으로 조작해가며 데이터를 가져오는 방법이 있습니다
이러한 동작을 가능하게 해주는 selenium 이라는 라이브러리가 있습니다
간단한 selenium 예시
from selenium import webdriver
driver = webdriver.Chrome() <- 크롬실행
driver.implicitly_wait(10) <- 지연속성
driver.get("https://testPage.co.kr") <- 페이지 이동
elem = driver.find_element_by_tag_name("hello_input") <- ui 선택
elem.send_key("hello!") <- 해당 ui로 값 전달