웹페이지의 데이터를 추출하는 것.
html문서에서 원하는 부분을 쉽게 찾도록 도와주는 라이브러리
( pycharm에서 다운로드함 )
pycharm실행 > 설정 > 프로젝트 > python 인터프리터 > + > 'bs4' 검색 > 패키지 다운로드
import requests
from bs4 import BeautifulSoup
# URL을 읽어서 HTML를 받아오기
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('웹페이지url',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만들기
soup = BeautifulSoup(data.text, 'html.parser')
# 여기서부터 코딩
# 웹페이지를 html로 확인할 수 있음
print(soup)
[네이버영화] 영화랭킹페이지에서 제목만 추출하기(https://movie.naver.com/movie/sdb/rank/rmovie.naver)
원하는 정보(ex.제목)에 마우스 우클릭 > 검사>
선택된 개체 우클릭 > copy > copy selector > 코드에 붙여넣기
=> '#old_content > table > tbody > tr:nth-child(2) > td.title > div > a'
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
.text : 태그를 제외한 문자열만 추출하여 불러옴
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title.text)
영화 두개의 제목을 Copy selector로 붙여놓고 비교하면,
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
'#old_content > table > tbody > tr' 이
동일한 부분임을 알 수 있다.
( :nth-child 부터 다르니까 :nth-child 전까지 )
select를 이용해서, tr들을 불러와, movies를 print해보면 데이터형태를 확인할 수 있고
movies = soup.select('#old_content > table > tbody > tr')
print(movies)
movies(tr들)의 반복문을 돌려서
movie안에 a 태그가 있다면 (비어있는 공간(None)이 아니라면), a태그의 텍스트(제목)만을 나타내고 페이지의 모든 정보가 print된다.
for movie in movies:
title = movie.select_one('td.title > div > a')
if title is not None:
print(title.text)
** img 태그의 alt값이 필요한 경우,
#rank copy selector한 부분
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
rank의 경우 img태그의 alt값이 달랐음.
그럴때에는,
rank = movie.select_one('td:nth-child(1) > img')['alt']
print(rank)
로 입력하면 rank만 가져올 수 있음.