본문 바로가기
개발일지/selenium, BeautifulSoup, requests

beautifulsoup netflex 웹 스크래핑 (제목, 링크, 이미지링크)

by 다니엘의 개발 이야기 2022. 6. 24.
320x100

# 첫번째 셀

import chromedriver_autoinstaller

from bs4 import BeautifulSoup
from selenium import webdriver

 

# 두번째 셀

chromedriver_autoinstaller.install()

 

# 세번째 셀

url = 'https://www.netflix.com/kr/browse/genre/839338'
browser = webdriver.Chrome('두번째 셀에서 나온 값')
browser.get(url)

 

# 네번째 셀

html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')

 

# 다섯번째 셀

# 총 섹션
section_list = soup.select('section.nm-collections-row')
len(section_list)

 

# 여섯번째 셀

# 총 섹션 내용 체크
section_list[2]

 

# 일곱번째 셀

# 단일 섹션

section = section_list[0]
len(section)

 

# 여덟번째 셀

# 단일 섹션에서 반복문으로 title, img, link를 뽑아 낼 수 있는 값을 지정
roop_list = section.select('li.nm-content-horizontal-row-item')
len(roop_list)

 

# 아홉번째 셀

# title

#1
# roop_list.select('span')
# 이렇게 해주니 어트리뷰트 에러가 났다. 바로 위에서 보면 알겠지만 75개의 리스트 중에서 span을 찾아주는게
# 될것같지만 뭔가 작동은 안되는것같다. 정확한 이유는 모르겠지만 그런갑다하고 받아들여야하는것같다.

#2
# 반복문을 활용해서 서치할때, 자동으로 리스트화 되어서 리스트구조로 돌아간 다는 것이 기억나서 [0]값을 추가해 줬다.
# roop_list[0].select('span')
#  [<span class="nm-collections-title-img placeholder"></span>,
#  <span class="nm-collections-title-name">기묘한 이야기</span>]
# 이런 값이 나온다. 어차피 []처럼 리스트화 된 것을 풀어줘야 .text등의 명령문이 먹기 때문에 풀어줘야한다.
# 첫번째 text값은 none이다. 따라서 두번째 text값을 사용하기 위해서 [1]로 써주자

#3
roop_list[0].select('span')[1].text

 

# 열번째 셀

# img

#1
# roop_list[0].select('img')
# 내용을 확인해주기 위해서 이렇게 실행했다. img 값이 src에 들어있다는 것을 확인했다.
# roop_list[0]이 나오니 생각난 것이지만, 이게 작동되어야 사실상 반복문이 먹는다는걸 깨달았다. 반복문과 리스트와의 연계가 진짜 반복문의
# 핵심이기 때문이다.

#2
# 리스트를 풀어주기 위해서 길이 확인
# len(roop_list[0].select('img'))
# 리스트를 안풀어주면 ['src']값을 가져올때 어트리뷰트 에러뜬다.

#3
roop_list[0].select('img')[0]['src']

 

# 열한번째 셀

# link

# 이동 링크는 기본적으로 anchor라는 의미의 a태그에 걸려서 href 값으로 들어가는게 웹표준에 해당하는 것으로 알고있다.
# 따라서 a태그에 속해주는 href 값을 찾아주자.
#1
# roop_list[0].select('a')
# 얼추 봤을때 그냥 길이는 1개인것같다.

#2
# 당연히 위의 것들과 같은 이유로 리스트를 풀어주기 위해서 1개의 길이가 있더라도 [0]처럼 리스트에서 나온 원소와 같이 빼줘야한다.
roop_list[0].select('a')[0]['href']

 

# 열두번째 셀

# 단일 섹션의 내용 반복문 테스트

# 여기서 for 다음에 쓰인 i는 사실상 무엇으로 써도 의미가 없다. 그냥 편의상 써주면 되고, 보통 i로 쓰는건 index를 의미하고
# d라고 쓴건 data를 의미한다. 하지만 정식적으로 하는것도 아니고 그냥 이런걸 모를때부터 써오던 i로 쓰겠다.
for i in roop_list:
    title = i.select('span')[1].text
    img = i.select('img')[0]['src']
    link = i.select('a')[0]['href']
    # 마지막 sep=''를 통해서 여기에 해당하는 print문에 대하여 한칸 내림정렬로 진행된다. (엔터키 기능)
    print(title, img, link, sep='\n')
    # 이것을 통해서 n번째 단락과 n+1번째 단락을 구분해준다.
    print()

 

# 열세번째 셀

# 총 섹션의 반복문
#1
for section in section_list:
    roop_list = section.select('li.nm-content-horizontal-row-item')

    for i in roop_list:
        title = i.select('span')[1].text
        img = i.select('img')[0]['src']
        link = i.select('a')[0]['href']
        # 마지막 sep=''를 통해서 여기에 해당하는 print문에 대하여 한칸 내림정렬로 진행된다. (엔터키 기능)
        print(title, img, link, sep='\n')
        # 이것을 통해서 n번째 단락과 n+1번째 단락을 구분해준다.
        print()

 

# 열네번째 셀

#2
#1에서 link부분에서 index Error로 끊겼다. 이건 보통 더이상 link에 값이 없거나, 값이 듬성듬성 있는것이다.
# 때문에 예외처리를 해준다.

for section in section_list:
    roop_list = section.select('li.nm-content-horizontal-row-item')

    for i in roop_list:
        title = i.select('span')[1].text
        img = i.select('img')[0]['src']
        try:
            link = i.select('a')[0]['href']
        except:
            link = 'empty'
        # 마지막 sep=''를 통해서 여기에 해당하는 print문에 대하여 한칸 내림정렬로 진행된다. (엔터키 기능)
        print(title, img, link, sep='\n')
        # 이것을 통해서 n번째 단락과 n+1번째 단락을 구분해준다.
        print()

300x250