★ 아직 많이 부족합니다. 댓글을 통한 가르침 환영입니다. ★
이번에는 Python을 활용하여 네이버 영화순위를 크롤링해오도록 하겠습니다.
제가 분석할 URL은 http://movie.naver.com/movie/sdb/rank/rmovie.nhn 입니다.
HTML을 가져와 분석하기 위해, BeautifulSoup4를 활용하겠습니다.
들어가기 앞서, 제 개발환경은
[ Windows 10 64-bit, Python 3.5.4, IDE : Pycharm ]
에 [Anaconda3]를 활용하고 있습니다.
자, 그럼
가장 먼저, BeautifulSoup4을 설치해보도록 하죠.
pip install BeautifulSoup4
다음은, URL의 정보를 가져오기 위해 코드를 작성해봅시다.
BeautifulSoup을 활용할 경우 코드가 정말 간단히 작성됩니다.
1
2 |
from bs4 import BeautifulSoup
import urllib.request |
cs |
이렇게 두 라이브러리를 import 해줍니다.
1 |
html = urllib.request.urlopen('http://movie.naver.com/movie/sdb/rank/rmovie.nhn') |
cs |
이렇게 URL을 통해 가져온 html 데이터를 BeautifulSoup4를 활용하여 분석하도록 하겠습니다.
1 |
soup = BeautifulSoup(html, 'lxml') |
cs |
여기서, 혹시 에러가 발생한다면
pip install lxml
을 설치해주도록 합니다. 다음,
1 |
print (soup) |
cs |
을 통해 출력을 해보면, 네이버 영화 순위 사이트에 해당하는 HTML 데이터가 출력되는 것을 확인할 수 있습니다.
사이트 진입 후, F12 개발자도구를 열어 확인할 수 있는 데이터입니다.
그럼 이 URL을 본격적으로 분석해보도록 하겠습니다.
1 |
titles = soup.find_all('td', 'title') |
cs |
먼저, 각 순위에 해당하는 모든 영화 정보를 titles에 담아옵니다.
이렇게 코드를 작성한 이유는,
F12 개발자도구를 확인하여 2017년 12월 17일 기준 1등인 영화 '강철비'라는 텍스트가 위치한 곳이
td -> div -> a href 의 텍스트로 위치해있기 때문에, td 클래스의 이름은 title인 것을 가져오도록 작성하였습니다.
1
2
3
4
5
6
7
8
9
10
11 |
<td class="title">
<div class="tit3">
<a href="/movie/bi/mi/basic.nhn?code=155665" title="강철비">강철비</a>
</div>
</td>, <td class="title">
<div class="tit3">
<a href="/movie/bi/mi/basic.nhn?code=160399" title="기억의 밤">기억의 밤</a>
</div>
...(중략)... |
cs |
이렇게 가져오며,
여기서
<a href="/movie/bi/mi/basic.nhn?code=155665" title="강철비">강철비</a>
위 줄의 빨간색의 강철비 텍스트를 가져오기 위해서는
1 |
print (titles[0].find('a').text) |
cs |
와 같이 작성하여 가져올 수 있습니다.
그렇다면, 50개의 모든 영화순위를 가져오기 위해 반복문을 작성해보겠습니다.
1
2
3
4
5 |
rank = 1
for title in titles:
print(str(rank) + "위 : " + title.find('a').text)
rank += 1 |
cs |
순위를 명시해주기 위한 rank 변수도 만들어 위와 같이 반복문을 작성하면
1
2
3
4
5
6
7
8
9 |
1위 : 강철비
2위 : 기억의 밤
3위 : 꾼
4위 : 어쌔신: 더 비기닝
5위 : 스타워즈: 라스트 제다이
6위 : 메리와 마녀의 꽃
7위 : 신과함께-죄와 벌
8위 : 오리엔트 특급 살인
...(중략)... |
cs |
이와 같이 2017년 12월 17일 기준의 영화 순위가 출력되게 됩니다.
여기서 멈추지 않고 추가로, 각 영화의 링크 주소도 가져와보도록 하겠습니다.
위의 영화 이름을 가져왔던 코드에 한 줄을 추가하여
1
2 |
print (titles[0].find('a').text)
print (titles[0].find('a')['href']) |
cs |
다음과 같이 만들어,
<a href="/movie/bi/mi/basic.nhn?code=155665" title="강철비">강철비</a>
위의 파란색으로 표시된 링크까지 가져올 수 있게 됩니다.
1
2 |
강철비
/movie/bi/mi/basic.nhn?code=155665 |
cs |
링크를 완전하게 만들기 위해,
1 |
print ('http://movie.naver.com/' + titles[0].find('a')['href']) |
cs |
다음과 같이 수정하여,
1 |
http://movie.naver.com//movie/bi/mi/basic.nhn?code=155665 |
cs |
위와 같은 완전한 링크를 얻어냅니다.
그럼 이제 영화 순위와 함께, 영화의 링크도 가져오는 전체 코드를 작성해보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11 |
from bs4 import BeautifulSoup
import urllib.request
html = urllib.request.urlopen('http://movie.naver.com/movie/sdb/rank/rmovie.nhn')
soup = BeautifulSoup(html, 'lxml')
titles = soup.find_all('td', 'title')
front_url = 'http://movie.naver.com/'
rank = 1
for title in titles:
print(str(rank) + " : " + title.find('a').text + ' / link : ' + front_url + title.find('a')['href'])
rank += 1 |
cs |
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 |
1위 : 강철비 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=155665
2위 : 기억의 밤 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=160399
3위 : 꾼 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=152385
4위 : 어쌔신: 더 비기닝 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=100205
5위 : 스타워즈: 라스트 제다이 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=125488
6위 : 메리와 마녀의 꽃 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=159037
7위 : 신과함께-죄와 벌 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=85579
8위 : 오리엔트 특급 살인 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=154272
9위 : 반드시 잡는다 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=155411
10위 : 이프 온리 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=39440
11위 : 뽀로로 극장판 공룡섬 대모험 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=169349
12위 : 덩케르크 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=146480
...(중략)...
41위 : 무서운 꿈 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=170236
42위 : 역모 - 반란의 시대 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=142210
43위 : 정글 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=158623
44위 : 미옥 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=142317
45위 : 킹스맨: 골든 서클 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=149747
46위 : 극장판 포켓몬스터 너로 정했다! / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=165722
47위 : 쥬라기 월드: 폴른 킹덤 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=154285
48위 : 1급기밀 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=149504
49위 : 러브 액츄얼리 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=36843
50위 : 원더 / link : http://movie.naver.com//movie/bi/mi/basic.nhn?code=151196
2017-12-17 |
cs |
이렇게 BeautifulSoup을 통해 몇 줄 안되는 코드로 영화 순위를 가져오는 코드를 작성해보았습니다.
'크롤링' 카테고리의 다른 글
Selenium(셀레니움)을 활용한 크롤링 (2) | 2017.12.18 |
---|