[크롤링] 기초, 파싱, 데이터 프레임 작성

※크롤링은 파이썬으로 진행됨


 크롤링

 - 주로 인터넷 상의 웹 페이지를 수집하여 분류 및 저장 하는 행위


페이지를 받아오는 순서

1. 해당 웹 페이지에 '요청'

2. 요청 후 응답 받음

3. 해당 응답(웹 페이지)에서 원하는 정보를 추출 및 분류 후 저장



1. 해당 웹 페이지에 '요청'

1
2
3
import requests as req
url = 'https://www.naver.com'
req.get(url)
cs

해당 웹 페이지에 '요청'은 'requests' 라이브러리의 get( 'url 전체 주소') 함수를 이용


 Response[200] 일 경우 성공

 Response[406] 일 경우 실패를 의미


get 함수로 받아온 응답은 html 문서 형식으로 전달 된다.


naver 의 페이지에 요청 후, naver 페이지를 출력하는 경우

1
2
3
4
import requests as req
url = 'https://www.naver.com'
res = req.get(url)
print(res.text)
cs

아래와 같이 태그를 포함한 HTML Document 형식으로 반환된다


해당 반환 값에서 특정 태그에 있는 값을 추출하기 위해서는 별도의 라이브러리를 이용한다
1
from bs4 import BeautifulSoup as bs
cs

BeautifulSoup

- 웹 페이지 정보를 파싱해주는 라이브러리


웹 페이지에서 특정 태그의 값을 가져오는 방법

1. 가져오고 잎은 데이터가 있는 url 요청

2. 가져온 웹페이지 정보 파싱

3. 'select' 를 이용하여 추출, 파싱


예제)

네이버 페이지 특정 글자 가져오기


1
2
3
4
5
6
7
8
9
10
11
12
import requests as req
from bs4 import BeautifulSoup as bs
 
#네이버로 요청후 요청 받은 값을 저장
res = req.get('https://www.naver.com/')
 
#받은 응답 페이지에 대해 파싱
soup = bs(res.text,'lxml')
bb = soup.select_one('#NM_set_home_btn')
 
#해당 태그의 텍스트 값 
print(bb.text)
cs



※ 개발자 도구에서 원하는 위치에 대해 copy selector 수행시, 해당 태그까지의 경로를 정확하게 잡아낼 수 있음



예제2)
데이터 프레임을 활용한 5월 11일 영화 순위 출력
※데이터 프레임은 import pandas as pd 를 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests as req
from bs4 import BeautifulSoup as bs
import pandas as pd
 
#해당 페이지에 요청, 요청후 응답값 저장 - 2022-05-11 영화 순위 페이지
url = 'https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&date=20220511'
res = req.get(url)
 
= bs(res.text, 'lxml')
 
#페이지의 순위별 타이틀, 평점을 대상으로 파싱
movie = s.select('div.tit5>a')
score = s.select('td.point')
 
movie_list = []
score_list = []
rank_list = []
 
#1위(index+1)를 시작으로 데이터 삽입
for i in range(len(movie)):
    movie_list.append(movie[i].text)
    score_list.append(score[i].text)
    rank_list.append(i+1)
 
#데이터 프레임 생성
movie_rank = pd.DataFrame({'순위':rank_list,'영화':movie_list,'평점':score_list})
#순위를 index로 사용 
movie_rank.set_index('순위',inplace = True)
#
display(movie_rank)
cs




댓글