파다 평범일상

파이썬 HTML 태그 크롤링 프로젝트, selenium 사용 유튜브 동영상 태그 가져오기 (3) 본문

컴퓨터 IT/얕은 컴퓨터 지식과 프로그래밍

파이썬 HTML 태그 크롤링 프로젝트, selenium 사용 유튜브 동영상 태그 가져오기 (3)

파다 평범일상 2024. 6. 8. 19:38
반응형

프로젝트 요약

파이썬으로 작성된 스크립트를 사용하여, YouTube에 업로드된 동영상의 제목, 상세내용, 태그, 해시태그 가져오기

  1. 파이썬 스크립트를 실행할때 태그를 얻고오고 싶은 동영상의 링크를 매개변수로 전달한다.
  2. 파이썬 스크립트에서 웹 HTML 크롤링을 하여 YouTube 정보를 가져온다.
  3. 콘솔에 동영상의 제목, 상세내용, 태그, 해시테크를 출력한다.

해당 글 요약

  1. selenium 적용하기
  2. Youtube Title 크롤링 하기
  3. Youtube Tag 크롤링 하기
  4. Youtube Hash Tag 크롤링 하기
  5. 크롤링 시도와 결과

자세한 코드는 Git Hub 링크를 참조


selenium 적용하기

처음에는 selenium을 사용하지 않고, 바로 beautifulsoup를 통해서 Youtube 페이지를 크롤링하려고 했었다.

크롬의 개발자도구에서 Tag ID 및 Class를 확인하고 beautifulsoup를 사용했더니 Youtube Title (동영상 제목)은 바로 크롤링이 되었지만, Tag와 Hash Tag는 아무리해도 계속 비어있는 값만 나오고 얻어올 수 없었다.

 

대략 알아본 바로는 페이지가 동적으로 구현되고 있기 때문에 그냥 가져올 수 는 없었다.  selenium이 동적 페이지 크롤링을 할 수  있도록 제공하기 때문에 elenium을 적용하게 되었다. selenium이 동적으로 데이터를 어떻게 가져오는지에 대해선 아직은 모르겠다.

def run_selenium(target_url):
    # create selenium options
    options = webdriver.ChromeOptions()

    # hide selenium dynamic web page
    options.add_argument("headless")

    # run selenium
    driver = webdriver.Chrome(options=options)
    driver.get(target_url)
    
    # wait web dynamic loading
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "title"))
    )
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "description-text-container"))
    )
    
    return driver

 

Youtube Title 크롤링 하기

크롬 웹 페이지의 개발자 모드에서 Youtube Title (동영상 제목)이 어떤 태그를 사용하여 구현하고 있는지 확인하고, 그 태그만 전달하면 자동으로 크롤링을 해준다.

 

나는 다음 조건이 모두 참이면 Title 이라고 판단하였다.

  • div 태그로 구성되어 있어야 한다.
  • id가 title로 지정되어 있어야 한다.
  • class가 ytd-watch-metadata로 지정되어 있어야 한다.
  • 그때 yt-formatted-string로 설정되어있는 태그의 값이 있어야한다.
def catch_title(soup):
    title = (soup.find("div", attrs={"id": "title", "class": "ytd-watch-metadata"})).find("yt-formatted-string").text
    return title

 

Youtube Tag 크롤링 하기

크롬 웹 페이지의 개발자 모드에서 Youtube Tag (동영상에 적용된 태그)가 어떤 태그를 사용하여 구현하고 있는지 확인하고, 그 태그만 전달하면 자동으로 크롤링을 해준다.

 

나는 다음 조건이 모두 참이면 Tag라고 판단하였다.

  • meta 태그로 구성되어 있어야 한다.
  • 그 중에 property가 "og:video:tag"여야 한다.
  • 그때 설정되어있는 값이 있어야한다.
def catch_tag(soup):
    meta_tags = soup.find_all('meta', property="og:video:tag")
    contnt_tags = [tag['content'] for tag in meta_tags]
    tag = ', '.join(contnt_tags)
    return tag

Youtube Hash Tag 크롤링 하기

크롬 웹 페이지의 개발자 모드에서 Youtube Hash Tag (동영상에 적용된 해시태그)가 어떤 태그를 사용하여 구현하고 있는지 확인하고, 그 태그만 전달하면 자동으로 크롤링을 해준다.

 

나는 다음 조건이 모두 참이면 Hash Tag라고 판단하였다.

  • a 태그로 구성되어 있으면서 class_가 yt-core-attributed-string__link--display-type어야 한다.
  • 그때 설정되어있는 값이 있어야한다.
def catch_hash_tag(soup):
    expender_contents = soup.find_all("a", class_="yt-core-attributed-string__link--display-type")

    contnt_tags = []
    for content in expender_contents:
        if content.text[0] == "#":
            contnt_tags.append(content.text)
    
    hash_tag = ' '.join(contnt_tags)
    return hash_tag

크롤링 시도와 결과

지금까지 작성한 코드를 실행해보자. 나는 실행할때 매개변수로 Youtube URL을 전달 받도록 하였다.  

# Youtube URL은 아무거나 가져왔으며, " "로 묶어서 텍스트로 전달해야한다.
hasangsu@hasangsuui-MacBookPro catchYoutubeTAG % /opt/homebrew/bin/python3.9 /Users/hasangsu/Downloads/catchYoutubeTAG/src/main.py "https://www.youtube.com/watch?v=dYyH6DYBZDA"

 

위와 같이 실행하게되면, 터미널에 Youtube Title, Tag, Hash Tag를 출력한다.

Catch Information (Title, Tag, Hash Tag)
한국어시험 보러 부산까지 갔슴다😇 부산에서 최고의 드라이브🚗
한일커플, 국제커플, 국제연애, 日韓カップル, 国際カップル, 国際恋愛, 日本人彼女, 커플브이로그, 커플유튜브, Interracial Couple, japan girlfriend, korean boyfriend, seoul vlog, 韓国旅行, #부산, #釜山
#한일부부 #日韓夫婦 #부산여행

 

Comments