크롤링

hihyeon_cho·2022년 10월 24일
1

sparta-web

목록 보기
5/8

크롤링 ( crawling )

웹페이지의 데이터를 추출하는 것.

beautiful soup으로 크롤링하기

1) 다운로드

html문서에서 원하는 부분을 쉽게 찾도록 도와주는 라이브러리
( pycharm에서 다운로드함 )
pycharm실행 > 설정 > 프로젝트 > python 인터프리터 > + > 'bs4' 검색 > 패키지 다운로드

2) 기본구조

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)

3) 연습하기

[네이버영화] 영화랭킹페이지에서 제목만 추출하기(https://movie.naver.com/movie/sdb/rank/rmovie.naver)

1) 필요한 정보 가져오기

원하는 정보(ex.제목)에 마우스 우클릭 > 검사>
선택된 개체 우클릭 > copy > copy selector > 코드에 붙여넣기

=> '#old_content > table > tbody > tr:nth-child(2) > td.title > div > a'

2-1) 해당 개체의 제목을 태그까지 추출

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)

2-2) 해당 개체의 제목을 텍스트만 추출 (.text 사용 )

.text : 태그를 제외한 문자열만 추출하여 불러옴

title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title.text)

2-3 ) 페이지의 모든 제목을 추출하고 싶을 때,

영화 두개의 제목을 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만 가져올 수 있음.

profile
코딩은 짜릿해 늘 새로워 ✨

0개의 댓글