본문 바로가기
웹 기초/Crawling, MongoDB

Crawling (크롤링, 웹 스크래핑)

by 후닝훈 2021. 6. 13.
반응형

크롤링

- 무수히 많은 컴퓨터에 분산 저장되어 있는 문서를 수집하여 검색 대상의 색인으로 포함시키는 기술.

- 이미 받아온 웹페이지에서 필요한 정보를 가져와야함.

Package 설치

파이썬에서 크롤링을 위해 bs4 패키지를 설치해주자.

bs4, 크롤링 기본세팅

- 크롤링 하기 쉽도록 변환해 주는 라이브러리

import requests
from bs4 import BeautifulSoup

# 브라우저에서 요청한 것 처럼 변경해줌
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'}

#Ajax와 같은 기능
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

 

Select_one

영화 제목을 가져와보기

네이버 영화의 정보로 연습해보겠다.

1. Copy selector을 선택

2. 코드 추가 및 출력

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

print(title)
print(title.text) # 텍스트를 가져오고 싶을때
print(title['href']) # 태그의 속성을 가져옴

Select

Select_one은 하나를 가져왔다면 Select는 모두 가져올 수 있다. 이에따라서 copy selector도 여러개의 데이터를 가져와야 한다.

아래 화면을 보자

이렇게 1위부터 10위까지 다 가지고 오고 싶을때, 한줄만 선택되었을때의 selector를 보자

#old_content > table > tbody > tr:nth-child(2)
#old_content > table > tbody > tr:nth-child(3)

이러한 방식이면, tr을 모두 가져오고 싶을땐 아래의 코드를 적용하면 된다.

#old_content > table > tbody > tr

bs4 메소드로 select_one이 아닌 select를 사용한다.

trs = soup.select('#old_content > table > tbody > tr')

가져온 데이터에서 영화 제목 텍스트만 추가하려고 한다.

이때는 다시 네이버 영화로 돌아가서 해당하는 영화제목 > 검사 > 해당 태그에 copy selector 를 사용한다.

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

이미 tr 까지는 불러왔기 때문에 그 후로부터만 사용하여 select 메소드를 사용한다.

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    title = a_tag.text

위의 코드를 실행한다면, 아무 내용 없고 구분선으로 사용된 tr까지 가져와져 None type object가 있기에 오류가 발생한다. 따라서 None type을 제외하고 출력해야한다.

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        title = a_tag.text
        print(title)

출력은 다음과 같다.

 


순위와 평점 정보도 같이 가져오자.

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        title = a_tag.text
        star = tr.select_one('td.point').text
        print(rank, title, star)

반응형

'웹 기초 > Crawling, MongoDB' 카테고리의 다른 글

크롤링 결과를 DB에 저장, Request 사용  (0) 2021.06.14
MongoDB Update, Delete  (0) 2021.06.13
Robo 3T & Mongo DB - Insert, Find  (0) 2021.06.13
Database 란?  (0) 2021.06.13
Mongo DB 설치  (0) 2021.06.13

댓글