BeautifulSoup 라이브러리란?
! pip install bs4
import requests as req
from bs4 import BeautifulSoup as bs
response = req.get(url)
soup = bs(response.text, 'lxml') # html코드를 파싱(분석)
type(soup) ## <class 'bs4.BeautifulSoup'>
: BeautifulSoup 객체에서 CSS 선택자를 사용하여 원하는 요소를 선택하는 데 사용되는 함수
# select_one()함수 : 원하는 데이터 1개일 때 추출
soup.select_one('태그명')
# select()함수 : 원하는 데이터 추출(여러개 일 때)
soup.select('태그명')
soup.select('.클래스명')
soup.select('상위태그>하위태그')
soup.select('#아이디명')
soup.select('태그명[속성1=값1]')
# 예시 : '주차'검색하여 나온 기사 제목들 추출
import requests as req
from bs4 import BeatufulSoup as bs
res_park = req.get('https://search.naver.com/search.naver?sm=tab_sug.top&where=news&query=%EC%A3%BC%EC%B0%A8&oquery=%EC%BA%A0%ED%95%91&tqi=iZ8Wdsp0YiRssCfxPtVssssss2d-270145&acq=%EC%A3%BC%EC%B0%A8&acr=2&qdt=0')
res_park ## Response [200]
soup_park = bs(res_park.text, 'lxml')
articles = soup_park.select('a.news_tit') # class명이 news_tit인 a태그들
데이터프레임.to_csv(’파일경로.csv’, encoding=’euc-kr'|'cp949’)
데이터프레임.to_excel(’파일경로.xlsx’, encoding=’euc-kr'|'cp949’)
파일명 = open(’파일경로.txt’, ‘w’)
파일명.write(’내용’)
(여러 번 작성하려면, for loop을 이용해서 여러번 작성해야 함)파일명.close()
: 기존 페이지 내에 새로운 페이지를 삽입하는 태그
: 간과 관련된 작업을 수행하기 위해 사용되는 표준 라이브러리
time.sleep(초단위숫자)
으로 시간을 지연시켜서, 일정한 시간 간격을 주어서 웹페이지에 요청: 웹 요청 URL에 추가되는 매개변수의 형태로 사용되는 문자열
주소 ? key1=value1 & key2=value2
형식으로 되어 있는 주소 형식reqeusts.get(url, params={'key1':value1, 'key2':value2})
: requests의 get함수 안에 params에 딕셔너리 형태로 대입# 필요한 library Import
import requests as req
from bs4 import BeautifulSoup as bs
import time # 요청 할 때, 지연시간을 주기 위한 library
# 해당 url에 GET요청
url = 'https://oneroommaking.com/product/detail.html?product_no=1911&cate_no=61&display_group=1'
head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
res = req.get(url, headers = head)
res # 응답메세지 확인 ## Response [200]
# BeautifulSoup객체로 파싱
soup = bs(res.text, 'lxml')
soup.select('div.review_list_v2__message_container')
# => 경로를 잘잡아주었는데, 빈 리스트로 반환
# 리뷰부분의 태그 위에 iframe태그 존재
# 요청한 원룸페이지가 아닌, 해당 리뷰서비스를 제공하는 cream페이지로 요청
# cream페이지는 요청한 원룸페이지의 iframe태그의 src(sorce)속성에 있음!
##########################################################
# 리뷰페이지의 첫 페이지의 5개 리뷰 가져오기
## 리뷰페이지의 첫 페이지에 해당하는 iframe 태그의 url로 접속(GET요청)
url_iframe = 'https://review7.cre.ma/oneroommaking.com/products/reviews?product_code=1911&iframe_id=crema-product-reviews-2&widget_style=&app=0&parent_url=https%3A%2F%2Foneroommaking.com%2Fproduct%2Fdetail.html%3Fproduct_no%3D1911%26cate_no%3D61%26display_group%3D1&nonmember_token=&secure_device_token=V28b93e0df4e31b8a2fd0bc9ea579b674c056a54680756d897def44e62288ba95bf36007177dc6f281df543a833595e47d&iframe=1'
res = req.get(url_iframe)
res ## Response [200]
## BeautifulSoup객체로 파싱
soup = bs(res.text,'lxml')
reviews = soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text')
reviews ## 리뷰가 잘 들어와 있는 것 확인 완료!
cnt = 1 # cnt : 1로 초기화, 1부터 카운터가 되도록 세팅
for i in range(len(reviews)):
print(f'[{cnt}]') # 리뷰보기 편하게 숫자로 출력구분
print(reviews[i].text.strip()) # 공백제거하여 출력
print() # 결과 보기 좋게 개행 추가
cnt += 1
##########################################################
# 1~5페이지 리뷰 가져오기 (for loop 사용)
f = open('review.txt', 'w', encoding='utf-8') # 파일을 생성하고, 열고, 작성할거라는 선언
for pageNo in range(1,6): # pageNo : 1,2,3,4,5
url = f'https://review7.cre.ma/oneroommaking.com/products/reviews?app=0&iframe=1&iframe_id=crema-product-reviews-2&page={pageNo}&parent_url=https%3A%2F%2Foneroommaking.com%2Fproduct%2Fdetail.html%3Fproduct_no%3D1911%26cate_no%3D61%26display_group%3D1&product_code=1911&secure_device_token=V2c26c49798b678b5367dde9393aefc632a7ec4b849d05080fd331cef21fd252c8bfaf2e281921deb066e40748c3824d48&widget_env=100&widget_style='
# url : 1페이지는 page부분이 생략되어 있음 (2페이지 이후의 url 아무거나 복사해서 페이지부분 포맷팅)
res = req.get(url) # get요청
print(f"[현재 페이지 번호 : {pageNo}]") # 현재 페이지 번호 출력
soup = bs(res.text, 'lxml') # beautifulsoup 객체화
reviews = soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text') # 해당 페이지의 리뷰 요소들 선택
# for loop을 하나 더 사용하여 공백 제거 (strip()함수 사용)
for i in range(len(reviews)):
print(reviews[i].text.strip()) # 공백제거한 리뷰
print() # 개행
f.write(reviews[i].text.strip()+'\n') # 파일에 리뷰내용 작성
print('-'*80)
# 페이지 요청을 위한 시간 지연시키기
time.sleep(1) # 웹페이지가 바뀔 때의 시간을 확보해 주기 위해!!(적절한 딜레이 시간 설정)
f.close() # 파일 닫기
##########################################################
# 1~5페이지에 있는 리뷰 가져오기 (쿼리 스트링 이용)
for pageNo in range(1,6):
print(f"[{pageNo}]")
url2 = 'https://review7.cre.ma/oneroommaking.com/products/reviews?app=0&iframe=1&iframe_id=crema-product-reviews-2&parent_url=https%3A%2F%2Foneroommaking.com%2Fproduct%2Fdetail.html%3Fproduct_no%3D1911%26cate_no%3D61%26display_group%3D1&product_code=1911&secure_device_token=V2fc98f6259c654f126d62766e4ecf3f776c5f2b2aabadcc811e8b6e4ab1e67c01b3553921dea8a20d687711b910f76fc6&widget_env=100&widget_style=#'
res2 = req.get(url2, params={'page':pageNo})
# params : dictionary로 정의
# key : url의 'page='의 page로 정의
# value : page=3일 때의 3
soup2 = bs(res2.text, 'lxml') # beautifulsoup 객체화
reviews2 = soup2.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text')
for i in range(len(reviews2)):
print(reviews2[i].text.strip())
print()
print('-'*80)
time.sleep(2)