악으로 깡으로 파이썬 웹스크래핑한 후기

Bien·2022년 4월 8일
0

사실 벌써 좀 지난 일이지만, 파이썬 안배운 사람이 악으로 깡으로 웹스크래핑한 후기를 꼭 쓰고 싶었기에 이제라도 써본다.

파이널 프로젝트가 불러온 파급

교육과정에서 파이널 프로젝트를 진행하면서 우리조는 우리나라 3대장 ott 서비스의 콘텐츠를 검색 및 추천하는 서비스를 구현하고자 하였다. 이렇게 데이터 후작업이 힘들줄 알았으면 공공 데이터를 활용하는 쪽으로 할걸 아쉽게도 준비된 데이터가 없었기 때문에 우리 앞에는 선택지가 별로 없었다. 수작업 노가다를 하던가, 크롤링 즉, 웹스크래핑을 하던가.

우리 수업 과정에도 파이썬이 있었기 때문에 그 시간에 웹스크래핑도 끼워서 배울 수 있지 않을까 했으나, 다른 조원들도 각자 맡은 일을 하고 있었고, 나도 나대로 마음이 급했기 때문에 빠르게 내 나름대로 웹 스크래핑을 학습해서 하기로 결정했다. 지금 생각해보면 파이썬 교육은 단 2일로 어영부영 끝나서 지금 생각하면 정말 현명한 선택이였다😅.

일단 해보기

처음에는 익숙한 언어인 자바로 해보려고 했으나, 이상하게 인텔리제이가 크롬드라이버를 인식하지 못해서 포기하고 바로 내 강사님 구글과 유튜브를 통해 파이썬 웹스크래핑을 학습했다. 처음에는 vscode를 사용해서 웹스크래핑을 시도했다.

이건 내 피땀눈물나는 연습기록들

문제의 발생과 해결

문제는 넷플릭스를 해보던 중 발생했다. html 클래스에서 내가 필요한 정보만 빼오려고 이것저것 시도를 하면서 셀레니움으로 자동 로그인을 너무 빈번하게 해서 일까? 갑자기 넷플릭스 로그인이 안되는 지경에 이르렀다. 비밀번호를 바꾸고 다시 시도가 가능했지만 이래저래 불편했다. 계속 무한 스크롤을 반복해야했고, 로그인도 해줘야 하고... 그래서 셀단위 실행이 가능한 주피터 노트북을 활용해

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

soup에 모든 html을 넣은 후 필요한 정보를 가져오는 것을 이런 저런 방법으로 시도 했다. 셀 단위 실행이 가능해서 일까, 실패에 대한 부담도 줄었고 확실히 너무 편했다.

파이썬으로 한 웹스크래핑

웹스크래핑 자체는 내 생각보다 어렵진 않았다. find나 select를 잘 사용해서 원하는 class나 선택자를 잘 골라서 그 안에 들어간 데이터를 가져오는거라 html에 대한 이해가 있고, 섹션을 잘 나누고, 시간만 충분히 있다면 여러 시행착오를 거쳐 할 수 있을거라는 자신감이 생겼다.

# 섹션 지정
for section in section_list:

    # 프로그램 파트
    program_list = section.select('.ptrack-content')
    for program in program_list:
        program_title = program.select('.fallback-text')[0].text
        # program_img = program.select('img')[0]['src']
        program_link = "https://www.netflix.com"+program.select('a')[0]['href']
        browser = webdriver.Chrome('./chromedriver.exe')
        browser.get(program_link)
        time.sleep(1)
        html2 = browser.page_source
        soup2 = BeautifulSoup(html2,'lxml')
        details= soup2.find("div",attrs={"class":"details-container"})
        
        try:
            content = details.find("div",attrs={"class":"title-info-synopsis"}).get_text()
        except:
            content =''
            
        try:            
            actors = details.find("span", attrs={"class":"title-data-info-item-list"}).get_text()
        except:
            actors =''
            
        try:    
            program_year = details.find("span",attrs={"class":"title-info-metadata-item item-year"}).get_text()
        except:
            program_year=''
            
        try:    
            program_time = details.find("span",attrs={"class":"duration"}).get_text()
        except:
            program_time=''
            
        try:    
            program_age = details.find("span",attrs={"class":"maturity-number"}).get_text()
        except:
            program_age=''
        
        try:    
            program_tags = details.find("a",attrs={"class":"title-info-metadata-item item-genre"}).get_text()
        except:
            program_tag=''
        
        print(program_title,program_link,content,actors,program_year,program_time,program_age,program_tags,sep=' / ')
        data = [program_title,program_link,content,actors,program_year,program_time,program_age,program_tags]
        results.append(data)

이건 내가 특정 ott 웹 스크래핑을 하기 위해 짠 코드 일부 이다. 보통은 select를 사용하는게 더 좋다고 한다. for문을 사용해 상세페이지에 들어가 상세 정보까지 가져오는것까지 여러 어려움이 있었지만 결과물을 놓고 보면 뿌듯하다.
다만 ott별로 가져오는 정보가 조금씩 다르고, 우리 팀이 계획한 서비스는 우리만의 태그로 분류를 다시해야하기 때문에 아직도 데이터 후작업을 하고 있는건 정말...🤯...

profile
🙀

0개의 댓글