이번 포스팅에서는 네이버 영화 리뷰 및 평점을 크롤링해보겠습니다.
https://movie.naver.com/movie/point/af/list.nhn
네이버 영화평점
개요
- https://movie.naver.com/ 로 이동
- 평점/리뷰 메뉴 클릭
- 영화제목, 영화링크, 평점, 댓글을 크롤링한다.
요청방식
- url
- 요청방식
- get
- 요청파라미터
- page: 페이지 번호
- 1000 페이지 까지만 조회가능
항목
- base : table.list_netizen > tbody > tr > td.title : 이 td들 안에 다 있다.
- 영화제목 : >
a.movie : text
- href속성은 그 영화의 댓글만 모아놓은 url( 상대경로로 href="?st=mcode&sword=185917&target=after" 형식으로 쿼리 스트링만 있다.)
- 평점
-
div.list_netizen_score > em
의 text
-
- 댓글
- br의 next_sibling
- text조회하면 안의 하위 태그들의 text도 조회된다.
- br을 찾은 뒤 그 다음 노드로 찾는다.
- tag.next_sibling : 텍스트 노드까지 포함 해서 다음 노드를 반환한다.
- br다음의 text node를 조회할 것이므로 next_sibling 사용
- tag.next_element : 다음 element node 반환
- tag.next_sibling : 텍스트 노드까지 포함 해서 다음 노드를 반환한다.
- br을 찾은 뒤 그 다음 노드로 찾는다.
1페이지 조회
import requests
from urllib import parse
from bs4 import BeautifulSoup
base_url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'
url = base_url.format(1)
res=requests.get(url)
if res.status_code == 200:
soup = BeautifulSoup(res.text)
tds = soup.select('table.list_netizen > tbody > tr > td.title')
print(len(tds))
for td in tds:
movie_title = td.select_one('a.movie').text.strip()
link = td.select_one('a.movie').get('href')
link = parse.urljoin(base_url, link)
score = td.select_one('div.list_netizen_score > em').text.strip()
comment = td.select_one('br').next_sibling.strip() #textnode 인 경우 text 로 조회할 필요 없다.
print(movie_title, link, score, comment, sep=' :: ')
print('-------------------------------------------------')
#결과
전체 페이지 조회
페이지를 바로바로 넘기면 크롤링이 안될수 있을 뿐만 아니라 네이버측에서 크롤링을 막을 수 있기 때문에 Delay를 걸어주어야 한다.
import random
random.uniform(0.2, 1.2) #이 사이의 실수를 동일한 확률로 나오게 한다.
import requests
import time
import random
from bs4 import BeautifulSoup
base_url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'
#결과 저장할 리스트
comment_list = []
for page in range(1, 101):
url = base_url.format(page)
res=requests.get(url)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
tds = soup.select('table.list_netizen > tbody > tr > td.title')
for td in tds:
movie_title = td.select_one('a.movie').text.strip()
link = td.select_one('a.movie').get('href')
link = parse.urljoin(base_url, link)
score = td.select_one('div.list_netizen_score > em').text.strip()
comment = td.select_one('br').next_sibling.strip()
# 리스트에 저장
comment_list.append((movie_title, link, score, comment))
interval = round(random.uniform(0.2, 1.2), 2)
time.sleep(interval)
print('종료')
저장
import pandas as pd
df = pd.DataFrame(comment_list,
columns=['영화제목','영화링크', '평점','댓글'])
df.to_csv('naver_comment.csv', encoding='utf-8', index=False)
#결과
728x90
반응형
'Data Engineering > Crawling' 카테고리의 다른 글
[Crawling] NS SHOP 제품목록 크롤링 (0) | 2020.08.05 |
---|---|
[Crawling] 다나와(danawa) 제품 리스트 크롤링 (0) | 2020.08.05 |
[Crawling] TripAdvisor 댓글 크롤링 (0) | 2020.08.05 |
[Crawling] Headless 브라우저 (0) | 2020.08.05 |
[Crawling] YouTube 동영상 목록 크롤링 (0) | 2020.08.05 |