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

beautifulsoup 이용한 netflex 스크래핑 (드디어 해냈다..)

by 개발에정착하고싶다 2022. 6. 23.
320x100

아... 이거 강의 듣다말고 시도해보고, 분해해보고 조립하고 하느라 결국 성공하고 이해하는데 8시간정도 걸린것같다;

ㅋㅋㅋㅋㅋ

 

휴... 총 시도는 전체적으론 7번에 부분적으론 수백번씩 시도해보고 분해해보고 조립해보길 반복한것같다;

 

원인은 간단했다.

 

# 0 기본베이스 (불변)

 

# 기본환경 셋팅

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

 

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

=============================================================

 

# 1 첫번째 시도 케이스

 

# 섹션 선택
section = section_list[0]

# 타이틀
title = section.select('span.nm-collections-title-name')[0].text

# 이미지 링크
img = section.select('img.nm-collections-title-img')[0]['src']

# 영화 링크
movie = section.select('a')[0]['href']

print(len(title), len(img), len(movie))

 

이렇게 해서 각각의 작동은 되었고, 값을 가져오는 것도 가능했다. 근데

 

# 계속 에러가 나는 코드로써 원인을 분석해보자.
count = 0
for i in section:
    title = i.select('span.nm-collections-title-name')[0].text
    img = i.select('img.nm-collections-title-img')[0]['src']
    link = i.select('a')[0]['href']
    print(title, img, link, sep='\n')
    print()
    count += 1
    
print(count)

 

이렇게 써줬는데 어떻게 분해해보고 뜯어봐도 에러가 나는것이다.

 

===============================================

# 우선 실패코드에 대해서 복기를 해보자.

 

1) 반복문을 돌릴때 작용하는 메인 요소가 "section"이였다.

그리고 이 section의 len값은 2였다. 당연하게도 2번초과로는 작동하지 않는것이였는데도 이것을 계속 고집했다;

 

2) 일단 1)부터가 크리티컬한 실수였으니 작동안되는건 당연하지만 title부터가 index error가 났고,

조정을 어떻게 해줘도 문제가 생겼다.

 

이 전의 시도도 모양은 달라도 원리는 같았다.

넷플릭스 스크래핑을 생각해보자면

가장 큰 덩어리로 움직이는 구간이

1. 섹션들

2. 섹션들을 섹션으로 쪼개주고

3. 섹션 안에 있으면서 title, img, link 3개를 모두 품고있는 가장 하위의 태그를 활용했어야 했는데 뒤늦게 깨달았다.

그래도 결과는 성공했다.

================================================================

 

# 성공케이스

 

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

 

# 반복문을 염두해두고 있기 때문에, 모두를 감싸고 있는 대형의 순서대로 접근해야한다.
# 섹션
section = section_list[0]

# 원하는 값이 title, img, link 인데 이것을 모두 감싸고 있는 태그가 li다.
program_list = section.select('li.nm-content-horizontal-row-item')
len(program_list)

 

# title
program_list[0].select('span')[1].text

 

# img
program_list[0].select('img')[0]['src']

 

# link
program_list[0].select('a')[0]['href']

 

# 가장 기본
count = 0
for program in program_list:
    title = program.select('span')[1].text
    img = program.select('img')[0]['src']
    link = program.select('a')[0]['href']
    print(title, img, link, sep='\n')
    count += 1
    
print(count)

 

================================

여기까지 테스트를 해보니 각각의 구간에서 모두 정상작동했다.

사실 부분섹션 반복까지 성공하면 끝난거나 다름없었다.

 

section_list = soup.select('section.nm-collections-row')

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

    for program in program_list:
        title = program.select('span')[1].text
        img = program.select('img')[0]['src']
        try:
            link = program.select('a')[0]['href']
        except:
            link = 'empty'
        print(title, img, link, sep='\n')

 

이렇게 끝내주었고

link에 예외처리를 해준 이유는 index error가 떴고, 이건 경험상 진행은 더 되어야 하지만

해당 부분에 값이 아예 없거나, 중간중간 비어있는 값이 있기 때문에 스탑하는 코드를 방지하기 위해서 해줬다.

 

휴.. 암튼 넷플릭스 스크래핑도 엑셀전송만 남았고, 이것을 리스트업 시켜서 엑셀화 시키는건

스타벅스때 딕셔너리 리스트를 활용했던것처럼 하면 간단히 해결될것같다.

 

재밌었다.

300x250