728x90

Review
참고 포스팅 :

2020/05/23 - [Python Programming/Using Packages] - [데이터크롤링] 데이터크롤링을 위해 HTML 이해하기

[데이터크롤링] 데이터크롤링을 위해 HTML 이해하기

안녕하십니까, 간토끼입니다. 파이썬 관련 첫 포스팅입니다. (사실 파이썬은 자신없지만) 데이터크롤링 시리즈는 약 5번에 걸쳐 게시될 예정입니다. 1. 데이터크롤링 데이터크롤링, 혹은 스크래�

datalabbit.tistory.com

2020/05/24 - [Python Programming/Using Packages] - [데이터크롤링] Requests, BeautifulSoup 패키지를 이용한 파이썬 크롤링 맛보기

[데이터크롤링] Requests, BeautifulSoup 패키지를 이용한 파이썬 크롤링 맛보기

Review 참고 포스팅 : 2020/05/23 - [Python Programming/Using Packages] - [데이터크롤링] 데이터크롤링을 위해 HTML 이해하기 [데이터크롤링] 데이터크롤링을 위해 HTML 이해하기 안녕하십니까, 간토끼입니다...

datalabbit.tistory.com

2020/05/26 - [Python Programming/Using Packages] - [데이터 크롤링] 파이썬 크롤링 데이터 엑셀로 저장하기 with Openpyxl 패키지

[데이터 크롤링] 파이썬 크롤링 데이터 엑셀로 저장하기 with Openpyxl 패키지

Review 참고 포스팅 : 2020/05/23 - [Python Programming/Using Packages] - [데이터크롤링] 데이터크롤링을 위해 HTML 이해하기 [데이터크롤링] 데이터크롤링을 위해 HTML 이해하기 안녕하십니까, 간토끼입니다...

datalabbit.tistory.com


안녕하십니까, 간토끼입니다.

파이썬 크롤링 시리즈가 어느덧 4편이군요.
그럼 포스팅 시작하겠습니다.

우리가 지금까지 HTML을 이용해 내가 찾고자 하는 정보의 선택자를 파악하고,
requests, beautifulsoup 패키지를 이용해 원하는 정보를 긁어온 후 이를 openpyxl 패키지로 저장하는 방법에 대해서 다뤘습니다.

이번 포스팅은 조금 더 까다로운 환경에서의 크롤링 방법에 대해서 다뤄보겠습니다.

1. 동일한 선택자를 가진 개체 구분하여 수집 - list 활용 or nth-of-type
위 포스팅을 읽고 오신 분들이라면 아마 크롤링에 관심있거나, 혹은 수업시간에 배운 걸 다시 한번 살펴보고자 하는 목적 등 어쨌든 크롤링 실습이라는 목적을 갖고 계시지 않을까 싶습니다.
그렇기에 위 포스팅대로 크롤링을 하다 보면 아마 한번쯤 막히는 순간이 있지 않았을까 싶습니다.

예를 들면 이런 상황인 거죠.

출처 : 코딩좀알려주라('코알라')

위 영화 정보의 장르, 감독, 배우 정보를 수집하고 싶은데 이 세 개의 선택자가 모두 동일한 상황입니다.
이럴 때 어떡하면 좋을까요?

(1) select 함수로 출력된 list 활용하기
select 함수를 이용하면 list로 반환되므로, 이러한 특성을 이용해 index에 따라 각 개체를 분류해줍니다.

# 대충 import부터 parsing까지 했다 치고

movie_container = html.select("dl.lst_dsc")

for m in movie_container:
	# info에 장르, 감독, 배우를 한번에 저장
    # select를 이용하면 list로 반환
    info = m.select("dl.info_txt1 dd")
    
    
    # info[0] : 장르, info[1] : 감독, info[2] : 배우
    genre = info[0].select("a")
    director = info[1].select("a")
    actor = info[2].select("a")



(2) 선택자 응용(nth-of-type)
'~선택자':nth-of-type(n) 를 활용하면 같은 이름의 태그 중 n번째에 위치한 태그 데이터를 선택할 수 있습니다.

# 대충 import부터 parsing까지 했다 치고

movie_container = html.select("dl.lst_dsc")

for m in movie_container:
    # nth-of-type 을 이용하여 선택
    genre = m.select("dl.info_txt1 dd:nth-of-type(1) a")
    director = m.select("dl.info_txt1 dd:nth-of-type(2) a")
    actor = m.select("dl.info_txt1 dd:nth-of-type(3) a")



2. 링크 안에서 데이터 수집
이번에는 이런 상황을 가정해보죠.
영화 페이지에서 특정 영화를 클릭하면 접속되는 각 영화의 세부페이지가 있는 상황을 생각해봅시다.

출처: 코딩좀알려주라(코알라) 페이지

저 세부페이지에서 평점과 리뷰 댓글을 수집해보겠습니다.

이때 저 HTML 태그를 보면 이렇게 되어있습니다.

어벤져스: 엔드게임의 세부페이지로 접속되는 링크가 a 태그 안에 속성(attribute)으로 있는 걸 알 수 있습니다.
크게는 <a href = " 링크 "> , <img src = " 링크 "> 이렇게 속성값 예시를 들 수 있는데요.
자세한 건 HTML 시간이 아니니 이정도만 짚고 넘어가겠습니다.

결국 세부 링크로 이동하기 위해서는 파이썬을 이용해 저 a 태그 안에 있는 링크값을 가져와야 합니다.
속성값을 가져오는 방법은 다음과 같습니다.

# 이번에도 앞부분 생략

movie_container = html.select("dl.lst_dsc")

for m in movie_container:
    # 영화 제목(title)에 a 태그가 있으므로
    title = m.select_one("dt.tit a")
    
    # a 태그에서 속성 추출 => .attrs["href"]
    # 즉 title.attrs["href"] : 어벤져스 세부 페이지 주소
    # 따라서 기존 네이버영화 주소에 세부 페이지 주소를 결합
    url = "https://movie.naver.com" + title.attrs["href"]


.attrs["속성"] 이런 식으로 하면 세부 페이지 주소를 가져올 수 있고,
이후 과정은 앞에서 한 것처럼 requests.get을 이용해 세부 페이지 주소를 가져온 후, parsing해서 원하는 선택자의 정보를 추출하면 됩니다.


3. 이미지 데이터 수집 with urlretrieve

출처 : 코딩좀알려주라(코알라)

이번에는 이 어벤져스 포스터를 한번 수집해보죠.
위 a태그와 마찬가지로 img 태그 안에 src라는 속성으로 이미지의 주소가 담겨있는 것을 확인하실 수 있습니다.

이 이미지를 수집하기 위해서는 파이썬 기본 라이브러리 중 하나인 urllib을 이용하셔야 합니다.
urllib은 url을 통해 데이터 통신 및 저장을 할 수 있는 파이썬 내장 라이브러리입니다.
이때 우리는 urllib에 포함된 urlretrieve라는 method를 사용하겠습니다.

# 앞부분 마찬가지로 생략

for m in movie:
    title = m.select_one("dt.tit a")
	
    # 각 영화 세부페이지 url
    url = "https://movie.naver.com" + title.attrs["href"]
    
    # url(상세페이지)에 접속, html 파싱
    raw_each = requests.get(url, headers={"User-Agent":"Mozilla/5.0"})
    html_each = BeautifiulSoup(raw_each.text, 'html.parser')
    
    # 포스터의 src 속성값 찾기
    poster = each_html.select_one("div.mv_info_area div.poster img")
    poster_src = poster.attrs["src"]
    
    # 포스터 저장
    urlretrieve(poster_src, "저장경로/poster.png")
    
    # 파일이름 센스있게 저장하는법 : 영화 제목으로 저장하기
    urlretrieve(poster_src, "저장경로/"+title.text[:2]+".png")


이때 파일명에는 특수문자가 쓰일 수 없으므로, 무난하게 영화 제목의 2글자만 출력하도록 설정했습니다.

다음 포스팅은 크롤링의 가장 재밌는 파트, 동적 웹페이지 크롤링을 위한 selenium에 대해서 다뤄보겠습니다.

감사합니다.
잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)
(구독이면 더욱 좋습니다 ^_^)



- 간토끼(DataLabbit)
- University of Seoul
- Economics, Data Science

728x90

+ Recent posts