pip install bs4
로 설치# 라이브러리 가져오기
import requests
from bs4 import BeautifulSoup
# www.example.com 사이트를 요청한 후 응답 받아보기
res = requests.get("http://www.example.com")
# 첫번째 인자: response의 body를 텍스트로 전달
# 두번째 인자: "html"로 분석한다는 것을 명시
soup = BeautifulSoup(res.text, "html.parser")
# 분석된 HTML을 보기 편하게 반환 (indent 맞춰서)
print(soup.prettify())
# title 가져오기
soup.title
# head 가져오기
soup.head
# body 가져오기
soup.body
# <h1> 태그로 감싸진 요소 하나 찾기
# find("태그 이름") : 지정한 첫번째 태그를 가져옴
h1 = soup.find("h1")
# <p> 태그로 감싸진 모든 요소들 찾기
p = soup.find_all("p")
# 태그 이름 가져오기
h1.name
# 태그 내용(콘텐츠) 가져오기
h1.text
# <h1> 태그 안에 <a>태그로 감싸진 내용(콘텐츠) 가져오기
h1.a.text
# <h1> 태그 안에 <a>태그로 감싸진 title 속성 값 가져오기
h1.a["title"]
id
와 class
태그는 자신의 이름 뿐만 아니라 고유한 속성 또한 가질 수 있다.
이 중에서 id
와 class
는 Locator로서, 특정 태그를 지칭하는 데에 사용된다.
tagname
: 태그의 이름id
: 하나의 고유 태그를 가리키는 라벨class
: 여러 태그를 묶는 라벨<p>This element has only tagname</p>
<p id="target">This element has tagname and id</p>
<p class="targets">This element has tagname and class</p>
id
를 이용해서 요소 가져오기id
는 요소 하나를 지칭하는 특별한 별명으로 고유해야한다.# id 없이 div 태그찾기
soup.find("div")
# id가 results인 div 태그를 찾기
soup.find("div", id="results")
class
를 이용해서 요소(들) 가져오기class
는 유사한 요소들을 구분짓는 별명이다.id
와 달리 중복으로 사용이 가능하다.# class가 "page-header"인 div 태그 찾기
find_result = soup.find("div", "page_header")
import requests
from bs4 import BeautifulSoup as bs
# 2번째 인자는 header
res = requests.get("https://hashcode.co.kr/", user_agent)
# BeautifulSoup 객체 생성
soup = bs(res.text, "html.parser")
# 태그가 <li>이고 클래스 명이 "question-list-item" 인 모든 요소 찾기
questions = soup.find_all("li", "question-list-item")
# questions 리스트를 순회하면서 깊이 들어가 있는 요소들을 출력
# .find()를 반복하며 깊이 들어간다.
for question in questions:
print(question.find("div","question").find("div", "top").h4.text)
import requests
user_agent = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
res = requests.get("https://hashcode.co.kr/", user_agent)
https://hashcode.co.kr/?page={i}
와 같이 page
값을 변수로 두고 페이지를 변경하면서 웹 스크래핑을 한다.# Pagination이 되어있는 질문 리스트의 제목을 모두 가져온다.
# 과도한 요청을 방지하기 위해 1초마다 요청한다.
import time
for i in range(1, 11):
res = requests.get(f"https://hashcode.co.kr/?page={i}", user_agent)
soup = bs(res.text, "html.parser")
questions = soup.find_all("li", "question-list-item")
print(f"--------------page={i}---------------")
for question in questions:
print(question.find("div","question").find("div", "top").h4.text)
time.sleep(1)
웹 브라우저에선 javascript 라는 프로그래밍 언어가 동작한다.
이 javascript는 비동기 처리를 통해서 필요한 데이터를 응답 이후에 채운다.
동적 웹사이트는 응답 후 바로 정보를 추출하기 어렵다
또한, 다양한 상호작용이 존재한다.
이런 상황을 해결하기 위해, 웹 브라우저를 파이썬으로 조작하는 전략을 취하자!
이는 웹 브라우저를 자동화하는 라이브러리 Selenium를 통해 실현할 수 있다