給新手的網路爬蟲、資料視覺化教學 —分析你愛的YT影片標題及流量(上)

YS Hsieh
Tableau用數據說故事
8 min readMay 15, 2024

你有在看志祺七七頻道嗎? 你知道最常出現在影片標題的人名是「韓國瑜」嗎? 2218部影片出現32次,「台灣」出現257次、「中國」出現109次。如果你也想幫自己喜歡的YT頻道做分析,可看看這篇新手入門教學!

最終成果: Tableau

這篇教學會follow Google Data Analytics Certificate提出資料分析的六步驟,包含ask、prepare、process、analyze、share、act,上篇先分享六大階段中的前三項,說明如何列出問題、寫爬蟲抓資料、Jieba斷詞。

Google 資料分析六階段,來源: Google Data Analysis certificate

專案流程

本篇提及前三項,後三項在下篇
1. [Ask] 確認動機
2. [Prepare]使用python寫爬蟲,擷取下文本,存成csv檔
3. [Process]使用Jieba斷詞、計算各keyword出現次數,存成csv檔

4. [Analysis]使用Excel觀察資料,找出有興趣的insights
5. [Share]使用Tableau繪製圖表及dashboard
6. [Act] 行動

先備技術知識 (有很好,沒有也沒關係)

  • Anaconda: 開源的資料科學平台,內含Python 2和3、Python常用套件、R、Jupyter Notebook…
  • Python 基本認識 : 可以先到Kaggle Learn自學python: 能看懂常用語法
  • Jupyter Notebook : 知道如何在上面run python code

我使用的是Win11、Anaconda 24.1.2,Python 3,如果你使用其他作業系統,可到Anaconda document確認使用方式。今天使用的code,可以在這個repo找到: https://github.com/yishanhsieh/shasha77-yt-crawling

1. Ask 確認動機

我最近想投志祺七七的接案寫手,申請時要附上提案,但志祺已經cover好多主題,每想到一個,就發現他已經講過了。於是靈機一動,如果可以分析他講過的主題和熱門程度,應該比較容易發想題目。我想知道志祺七七影片曾經討論過哪些議題? 哪些影片流量最高? 每年熱門Top 10影片有哪些? 目的是幫助我發想寫作主題,以應徵頻道的接案寫手。

2. Prepare 準備資料

要解答Ask提出的問題,具體而言我要蒐集哪些資料欄位? 要從何取得?

為了找到熱門議題,我選擇從影片標題分析關鍵字,再計算關鍵字出現次數排序,因此我需要取得 {影片標題}、並將其切字成 {影片關鍵字},此外也需要各片 {觀看次數},最好有時序資料 {上片時間},呈現不同年份的熱門影片。

再來是確認從哪裡取資料,yt > videos 頁面可以抓到所有影片及需要的資料欄位,目標url就選定 'https://www.youtube.com/@shasha77/videos'

爬蟲時間

這裡我們要設計程式,讓爬蟲程式自動根據你定義的路徑、id,抓取指定的欄位,例如id = ‘video-title’,可以取得影片標題。

開啟Jupyter Notebook

從Anaconda Navigator開啟Jupyter Notebook,安裝selenium。

pip install selenium  #我使用版本為4.20.0
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pandas as pd

driver = webdriver.Chrome()
url = 'https://www.youtube.com/@shasha77/videos' #可換成其他YT頻道
driver.get(url)

SCROLL_PAUSE_TIME = 3

last_height = driver.execute_script("return document.documentElement.scrollHeight")

while True:
#程式自動往下scroll
driver.execute_script("window.scrollTo(0, arguments[0]);", last_height)
#Wait to load page
time.sleep(SCROLL_PAUSE_TIME)

new_height = driver.execute_script("return document.documentElement.scrollHeight")
if new_height == last_height:
break
last_height = new_height

titles = driver.find_elements(By.ID, "video-title")
views = driver.find_elements(By.XPATH, '//*[@id="metadata-line"]/span[1]')
dates = driver.find_elements(By.XPATH, '//*[@id="metadata-line"]/span[2]')
data = []
for i, j, k in zip(titles, views, dates):
data.append([i.text, j.text, k.text])

df = pd.DataFrame(data, columns = ['title', 'views', 'date']) #可置換欄位標題名
df.to_csv('youtube_videos_details.csv') #輸出結果

driver.quit()

輸出結果如下:

youtube_vidoes_details.csv

結結結巴 Jieba切字

pip install jieba   #安裝Jieba
import jieba
import pandas as pd

file = open('C:\\Users\\yisha\\Youtube_crawl\\77yt_titles.csv').read().split('\n')
keyword_cnt = {}

for i in range(len(file)):
seg_list = jieba.cut(file[i])
for w in seg_list:
if w not in keyword_cnt:
keyword_cnt[w] = 0
keyword_cnt[w] += 1
print(keyword_cnt)

sorted_items = sorted(keyword_cnt.items(), key=lambda x: x[1], reverse=True)

# Display the sorted items
for key, value in sorted_items:
outcome = {key, ':', value}
print(key, ':', value)

outcome = open('C:\\Users\\yisha\\Youtube_crawl\\77yt_jieba_result.csv', 'w')
writer = csv.writer(outcome)
writer.writerows(sorted_items)

輸出結果如下:

77yt_jieba_result.csv

3. Process 資料清理

最終我們取得2,218部影片資料,時間從2018~2024。爬取結果youtube_videos_details.csv轉到Excel,使用Text to Columns將各資料分欄,用「取代」將觀看次數轉成numbers。Year是我手動填入,因為沒抓到具體上片年月日。

爬取結果轉成excel

Jieba切出的字有10,098個,包含介係詞、標點符號,為了縮小資料量,我取count ≥5,開始大概瀏覽有意義的關鍵字。

Jieba切字結果(部分)

到此前三個流程 Ask、Prepare、Process告一段落,下一篇將聚焦如何用Tableau作互動圖表。

感謝閱讀~ 一起創作、用數據圖表解決生活問題 d(`・∀・)b

--

--