본문 바로가기
웹 프로그래밍(풀스택-->python)

31. 웹스크래핑(크롤링) 기초

by 백엔드개발자0107 2021. 4. 20.

크롤링이란 뭘까?

 

크롤링이란

 

크롤링에서는 크롤링에 필요한 beautifulsoup4라는 라이브러리 및 패키지가 필요하다.

 

다운받자..!

 

크롤링을 할때는 기술적으로 2가지가 중요하다.

 

첫번째는 요청을 하는것이다. 코드딴에서 말이다. 브라우저를 키지않고 말이다.

 

두번쨰는 html안의 정보를 내가 원하는 정보로 솎아내는것이다.

 

이때 잘 솎아내는게 이 beautifulsoup의 역할이다.

 

항상 크롤링을 할때는 기본코드가 있다. 잊지말자!

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'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# 코딩 시작

이게 기본코드이다.

 

여기서 headers는 기본적인 크롤링을 막아놓은 브라우저를 막아놓은 브라우저를 풀어주는 역할을 한다.

 

자  아래와 같이 

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'}
data = requests.get(
    'https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

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

print(title.text)

soup.select_one()에서 select_one()메소드는 브라우저에서 찾고자 하는 태그를 선택할때 사용한다.

브라우저에서 "검사"->"copy Selector"이렇게 한다.

 

위와 같은 경우는 title.text를 사용해서 제목을 text로 가지고 올때 이용하는것이고,

반대로 title태그의 속성을 가지고 오고 싶을때는 "title["href"]"를 이용한다.

 

자, 이제 여러개의 내용을 가지고 올때는 select를 이용한다.

 

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

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

 

 

자 이런식으로 검사 해서 copy selector하면 위와 같이 나온다.

 

여기서 다른부분은 tr:nth-child(3) 이 부분이고

 

여기서 tr부분만 남긴다.

 

#old_content > table > tbody > tr

이렇게 만든다.

 

여기서 select 는 결과가 list로 나온다.

그래서 for 구문을 이용해서 하나씩 나오게 만든다.

 

자 여기서 인제 제목만 구하기 위해서는

 

다시 제목을 검사 copy selector 이용해서 

 

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a 여기서 찾은부분을 제외한

 

 td.title > div > a  이 부분만을 이용한다.

 

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'}
data = requests.get(
    'https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

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

for tr in trs:
    a_tag = te.select_one(" td.title > div > a ")
	print(a_tag)

 

이렇게 하면

 

이런식으로 결과값이 나온다.

 

여기서  잘 보면 중간중간에 None이 있다.

 

이거를 잘 보면 none은 아래와같은 이런 줄들이다.

 


 

이런 구분선(줄) 안에서 text를 가지고 오면 에러가 발생한다.

즉, print(a_tag.text)하면 에러가 발생한다.

그래서 이럴떄는

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'}
data = requests.get(
    'https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

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

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)

이렇게 하면 된다!!!