파이썬으로 쉽게 크롤러를 만들 수 있어, 간단한 네이버 영화 크롤러를 만들어보았다.
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 | 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 제작 감독 : ['데이빗 레이치'] 출연 배우 : ['라이언 레이놀즈', '조슈 브롤린', '재지 비츠', '모레나 바카린'] | cs |
아까 예외처리 해준 영화들은 아래와 같이 나온다.
1 2 3 4 | No. 31 영화 제목 : 영혼의 순례길 제작 감독 : ['장양'] 출연 배우 : 정보 없음 | cs |