Karlie_dev
{SourceCode}
Karlie_dev
전체 방문자
오늘
어제
  • 분류 전체보기
    • 컴퓨터공학
    • JAVA
    • CSS
    • 자바스크립트
    • 파이썬
    • 스프링
    • DB
      • SQL
      • MySQL
      • Oracle
      • MongoDB
      • MariaDB
    • 형상관리
    • IDE
      • VS Code
      • Eclipse
    • 알고리즘
    • Server
    • AWS
    • 개발소리
    • Docker&Kubernetes
    • Cloud (클라우드)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 마리아디비
  • oracle
  • 스프링부트
  • AWS
  • kubernetes
  • 파이썬
  • 오라클
  • mariadb
  • MongoDB
  • 자바스크립트
  • nodejs
  • k8s
  • Spring
  • JavaScript
  • 도커
  • MySQL
  • Minikube
  • 스프링
  • docker
  • 쿠버네티스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Karlie_dev

{SourceCode}

파이썬으로 네이버 영화 순위 크롤러 만들기 [1]
파이썬

파이썬으로 네이버 영화 순위 크롤러 만들기 [1]

2018. 5. 12. 21:40

파이썬으로 쉽게 크롤러를 만들 수 있어, 간단한 네이버 영화 크롤러를 만들어보았다.


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
31
32
33
# import
from bs4 import BeautifulSoup
from urllib.request import urlopen
 
url = urlopen("https://movie.naver.com/movie/running/current.nhn")
bs = BeautifulSoup(url, 'html.parser')
body = bs.body
 
target = body.find(class_="lst_detail_t1")
list = target.find_all('li')
no = 1
for n in range(0, len(list)) :
    print("=================================")
    print("No.",no)
    no += 1
    # 영화 제목
    title = list[n].find(class_="tit").find("a").text
    print("영화 제목 :\t", title)
 
    # 감독
    try:
        director = list[n].find(class_="info_txt1").find_all("dd")[1].find("span").find_all("a")
        directorList = [director.text.strip() for director in director]
        print("제작 감독 :\t", directorList)
    except IndexError:
        print("제작 감독 :\t 정보 없음")
    # 출연 배우
    try:
        cast = list[n].find(class_="lst_dsc").find("dl", class_="info_txt1").find_all("dd")[2].find(class_="link_txt").find_all("a")
        castList = [cast.text.strip() for cast in cast]
        print("출연 배우 :\t", castList)
    except IndexError:
        print("출연 배우 :\t 정보 없음")






1. 라이브러리 import


1
2
3
# import
from bs4 import BeautifulSoup
from urllib.request import urlopen
cs


BeautifulSoup은 urlopen으로 가져온 것을 html로 파싱하기 위한 것으로, 반드시 필요하다.


1-1. 라이브러리 설치 (Pycharm 기준)

[File] > [Settings] > [Project:(프로젝트명)] > Project Interpreter > 우측 추가 버튼 > BeautifulSoup, urlopen 검색해서 설치




2. URL OPEN


1
2
3
url = urlopen("https://movie.naver.com/movie/running/current.nhn")
bs = BeautifulSoup(url, 'html.parser')
body = bs.body
Colored by Color Scripter
cs


urlopen 매개값에 크롤링할 페이지 주소를 넣는다.

BeautifulSoup이 해당 urlopen으로 가져온 것을 html로 파싱해줄 때, HTML의 처음부터 끝까지 긁어오는데

bs.body와 같이 해준다면 body 부분만 미리 지정해줄 수 있다.




3. 요소 지정


1
2
3
target = body.find(class_="lst_detail_t1")
list = target.find_all('li')
no = 1

cs


요소를 지정할 때, HTML 구조를 알면 더 편하다. 구글 개발자 모드로 볼 때 리스트를 감싸고 있는 것은 lst_detail_t1 이므로, find로 지정해준다. find는 요소 하나만 지정이 가능하고 find_all은 여러 개 요소 선택이 가능하다. 즉 여기에서는 리스트의 세부 요소(각각 하나하나의 영화 정보)를 find_all로 지정해준다.


find를 한 뒤에 find_all은 가능하지만, find_all을 하고 find를 하면 오류가 발생한다. find_all 자체는 리스트이기 때문에 find를 find_all로 선택된 요소의 첫 번째에서 find를 해야하는지, 두 번째 요소에서 해야 하는지 알 수 없기 때문이다.

만약 사용해야 한다면 아래와 같이 find_all을 한 뒤에 선택 요소에 인덱싱을 지정해준다.


1
2
target = body.find_all('li')
list = target[0].find(class="lst_detail_t1")
cs





4. for문 생성


총 영화 제목, 감독, 출연 배우 정보를 구한다.

이때 영화 리스트를 모두 구하기 위해 range로 구한 list의 갯수만큼 for문을 돌린다.

영화 제목을 구하는 것은 쉽지만 감독과 출연 배우 구하는 것은 조금 까다롭다.


11번째 행 코드는, list의 n번째 중에 info_txt를 찾은 뒤에 dd요소를 모두 찾고 그 중에서 첫번째의 span을 찾은 뒤에 a태그를 찾는다.

그리고 그 구한 값을 12행에서 컴프리헨션으로 text를 구하고 앞 뒤 공백을 모두 잘라내어 담는다.

이 때, 감독, 출연 배우 모두 네이버 영화 리스트 자체에 값(이름)이 없는 경우가 있다.

이 때 IndexError 가 발생하므로, try로 오류를 잡아 예외처리를 해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for n in range(0, len(list)) :
    print("=================================")
    print("No.",no)
    no += 1
    # 영화 제목
    title = list[n].find(class_="tit").find("a").text
    print("영화 제목 :\t", title)
 
    # 감독
    try:
        director = list[n].find(class_="info_txt1").find_all("dd")[1].find("span").find_all("a")
        directorList = [director.text.strip() for director in director]
        print("제작 감독 :\t", directorList)
    except IndexError:
        print("제작 감독 :\t 정보 없음")
    # 출연 배우
    try:
        cast = list[n].find(class_="lst_dsc").find("dl", class_="info_txt1").find_all("dd")[2].find(class_="link_txt").find_all("a")
        castList = [cast.text.strip() for cast in cast]
        print("출연 배우 :\t", castList)
    except IndexError:
        print("출연 배우 :\t 정보 없음")






5. 크롤링 결과



결과는 1위부터 5위까지 하면 아래와 같이 나온다.(실제로는 80개 이상 나온다.)


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
=================================
No. 1
영화 제목 :     쥬라기 월드: 폴른 킹덤
제작 감독 :     ['후안 안토니오 바요나']
출연 배우 :     ['크리스 프랫', '브라이스 달라스 하워드']
=================================
No. 2
영화 제목 :     독전
제작 감독 :     ['이해영']
출연 배우 :     ['조진웅', '류준열', '김주혁', '김성령', '박해준']
=================================
No. 3
영화 제목 :     극장판 포켓몬스터DP - 디아루가 VS 펄기아 VS 다크라이
제작 감독 :     ['유야마 쿠니히코']
출연 배우 :     ['임채헌', '이선호', '정미숙', '변영희', '오오타니 이쿠에', '마츠모토 리카', '우에다 유지']
=================================
No. 4
영화 제목 :     아이 필 프리티
제작 감독 :     ['에비 콘', '마크 실버스테인']
출연 배우 :     ['에이미 슈머', '미셸 윌리엄스']
=================================
No. 5
영화 제목 :     데드풀 2
제작 감독 :     ['데이빗 레이치']
출연 배우 :     ['라이언 레이놀즈', '조슈 브롤린', '재지 비츠', '모레나 바카린']
 
Colored by Color Scripter
cs


아까 예외처리 해준 영화들은 아래와 같이 나온다.


1
2
3
4
No. 31
영화 제목 :     영혼의 순례길
제작 감독 :     ['장양']
출연 배우 :     정보 없음
cs

이 뒤에는 지금 크롤링한 것을 몽고 DB에 넣는 것까지 포스팅하는 걸로


저작자표시 (새창열림)
    '파이썬' 카테고리의 다른 글
    • 파이썬으로 네이버 영화 순위 크롤러 만들기 [2] 몽고DB에 넣기
    • 컴프리헨션(Comprehension) 구문 해석
    • ~의 배수 구하기
    Karlie_dev
    Karlie_dev

    티스토리툴바