BeautifulSoup 설치
pip install beautifulsoup4
Window 운영체제를 사용하고 있다면 cmd에서, Mac 운영체제를 사용하고 있다면 terminal에서 설치!
BeautifulSoup 기본 사용법
import requests
from bs4 import BeautifulSoup
news_url = 'https://news.naver.com/'
# requests 모듈을 사용하여 해당 URL에 포함된 HTML정보를 로드한다.
response = requests.get(news_url)
# response에 저장된 HTML정보를 binary형식에서 text형식으로 바꾼 뒤, soup 객체로 반환한다.
soup = BeautifulSoup(response.text, 'html.parser')
개발자 도구의 활용
개발자 도구(F12를 누르면 해당 페이지의 정보를 보여준다)에서 왼쪽 상단에 있는 빨간 네모칸에 있는 것(Inspecter)을 눌러 내가 추출하고자 하는 페이지의 부분을 클릭하면 해당 부분의 html이 사진과 같이 표시된다.
찾아진 HTML을 우클릭 한 후 copy selector 기능을 이용하면, CSS 선택자를 자동으로 찾아준다.
import requests
from bs4 import BeautifulSoup
url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
#API 처리용 Header
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
#API 이기 때문에 headers parameter를 추가
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.select_one('#main_content > div > div._persist > div:nth-child(1) > div:nth-child(1) > div.cluster_body > ul > li:nth-child(1) > div.cluster_text > a')
print(title)
BeautifulSoup모듈의 내장 함수인 soup객체에서 select_one함수를 이용하여 하나의 html 요소를 불러올 수 있다.
이렇게 추출된 결과물은 html형식으로 추출이 될텐데 만약 기사 제목처럼 text만 가져오고 싶다면
import requests
from bs4 import BeautifulSoup
url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
#API 처리용 Header
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
#API 이기 때문에 headers parameter를 추가
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.select_one('#main_content > div > div._persist > div:nth-child(1) > div:nth-child(1) > div.cluster_body > ul > li:nth-child(1) > div.cluster_text > a')
print(title.text)
이렇게 "print(title.get_text())" 표현하여 가져오면 된다.
위의 내용까지가 하나의 정보를 추출 할 때의 내용이다.
만약 한번에 여러개의 반복되는 정보를 뽑아내고 싶다면 어떻게 해야할까??
한번에 여러개의 반복되는 정보를 뽑아낼 때는 HTML과 CSS에 대한 이해가 조금 필요하다.
위와 같은 방법을 이용하여 개발자도구(F12)를 눌러 Inspecter를 이용하여 원하는 정보를 누른다.
개발자 도구의 HTML 부분(오른쪽에 빨간 네모칸)에서 보면 <a> 태그에 제목 정보가 담겨 있는 것을 확인 할 수 있다.
조금만 더 신경을 써 들여다 본다면 <a> 태그 위에는 상위 목록들로 부터 내려오는 것을 확인 할 수 있다.
저런 것들을 확인하여 한번에 list의 형태로 가져오는 방법이 있다.
밑의 예시코드와 사진을 살펴보자.
1. 가장 큰 부분에 대한 html 요소를 탐색
2. 더 작은 부분에 대한 html 요소를 탐색
3. 더 작은 부분에 대한 html 요소를 탐색
이렇게 하나하나 찾아가다 보면 어느 부분의 태그에서 찾고자 하는 부분이 반복(!!!!!)되는지 확인 할 수 있다.
<해당 예시에서는 "div.cluster_group._cluster_content" 부분에서 찾고자 하는 태그들이 반복되는 것을 알 수 있다>
이를 이용하여 코드를 작성해보자.
import requests
from bs4 import BeautifulSoup
url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
#API 처리용 Header
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
#API 이기 때문에 headers parameter를 추가
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.select('#main_content > div > div._persist > div:nth-child(1) > div.cluster_group._cluster_content > div.cluster_body > ul > li:nth-child(1) > div.cluster_text > a')
for titles in title:
print(titles.text)
한번에 반복되는 여러 정보를 한번에 추출하기 위해 soup객체의 select함수를 사용할 때, select_one과 다른 점은 반복되는 부모태그를 찾아서 기입해야한다는 점이다.
예를 들어 여기서는 "div.cluster_group._cluster_content" 부분이 반복되기 때문에 하나만 찾을 때는 "div:nth-child(1)" 이렇게 기입되는데 바꿔서 코드를 작성한 것을 볼 수 있다.
마무리
Phython에서 웹 크롤링을 하는 방법에 대해 아주 간단하게 살펴보았다. 이번 페이지에서 든 예시는 계속해서 동적으로 변하는 페이지에 대해 크롤링을 진행하였기 때문에 header를 지정해주어야 해서 코드가 복잡해진 경향이 있는데 만약 처음 연습을 한다면 정적인 페이지로 연습해보는 것이 수월 할 것이라고 생각된다.
'Python > Module' 카테고리의 다른 글
[Python] Pandas 라이브러리 - DataFrame (0) | 2022.01.02 |
---|---|
[Python] requests 라이브러리 (0) | 2021.12.30 |