본문 바로가기
Python

파이썬 크롤링 requests, BeautifulSoup

by wanttosleep1111 2023. 1. 16.

파이썬 크롤링 requests, BeautifulSoup

 

1. requests 라이브러리 

  • 페이지의 정보 요청/응답
  • import requests as req
url = 'https://www.naver.com/'
# 네이버 페이지 요청
# url에 저장되어 있는 웹문서 요청하기!
# <Response [200]> 성공적으로 요청/응답이 진행된 상태
res = req.get(url)
res

# 문자열 -> txt
res.text

 

2. BeautifulSoup 라이브러리

  • 웹 문서 안에 있는 태그 데이터를 추출할 수 있도록 함수를 제공하는 라이브러리
  • 웹 문서(문자열) → 파이썬 객체 변환
  • 함수를 통해 원하는 정보에 접근
  • from bs4 import BeautifulSoup as bs
# 웹 문서(res.text) -> 파이썬 객체 변환
# bs(웹문서데이터, 변환도구)
html= bs(res.text,'lxml')
html

 

.select_one('css선택자') css 선택자에 맞는 html 객체 접근
.select('css선택자') 여러 개의 css 선택자에 맞는 html 객체 접근
.text 태그 안에 있는 문자 데이터 접근
# html.select_one('css선택자') : css선택자에 맞는 html 객체 접근
# css 선택자
# 아이디선택자 : #아이디명
# 클래스선택자 : .클래스명
# 태그선택자 : 태그명
# 계층선택자(자식(>), 자손(공백), 형제(~), 인접형제(+))
html.select_one('title').text
# 태그 안에 있는 문자 데이터 접근 : .text

 

▶ 연습

.select_one('css선택자')를 이용해 네이버에서 겨울 축제를 검색한 후 축제명 1개 데이터를 가져와보기

url2 = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EA%B2%A8%EC%9A%B8+%EC%B6%95%EC%A0%9C'
res = req.get(url2)
html2 = bs(res.text,'lxml') # 파이썬 객체 변환
print(html2.select_one('.this_text>a').text)

 

▶ 연습

.select('css선택자')를 이용해 여러 개의 축제 이름을 동시에 가져오기

# 여러 개의 축제 이름 접근해보기
ft_list = html2.select('.this_text>a')
# 축제 이름 문자열만 추출해보기
ft_list

# for문을 이용해서 축제 이름 데이터를 1개씩 가져오기
for i in ft_list :
    print(i.text)
for i in range(len(ft_list)) :
    print(ft_list[i].text)

 


 

3. 네이버에서 뉴스 가져오기

 

  • requests header 설정하기
    컴퓨터에게 브라우저에서 요청했다는 인식을 주기 위한 설정
    크롤링할 때 모든 페이지 요청 시 header 설정하고 갈 것
    값 : 개발자 도구 맨 위 useragent 
    header = {'user-agent' : 값}
    req.get(url, headers=header)

 

 

# requests, BeautifulSoup 불러오기
import requests as req
from bs4 import BeautifulSoup as bs
# 네이버 뉴스 > 생활/문화 탭 > 기사 하나 선택
news_url = 'https://n.news.naver.com/mnews/article/052/0001838287?sid=103'
# 요청/응답 확인
# res = req.get(url)
# res

# 컴퓨터에게 브라우저에서 요청했다는 인식을 주기 위한 설정
# 크롤링 시에 모든 페이지 요청 시 header 설정하고 갈 것
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
res = req.get(url, headers=header)
res

 

# 태그 데이터 접근 > 파이썬 객체 변환
html3 = bs(res.text,'lxml')
# 기사 제목, 기사 내용(문자)
title = html3.select_one('h2>span').text
content = html3.select_one('#dic_area').text
print(title)
print(content.strip()) # .strip() 양쪽 공백 제거

댓글