[Python] 抓取 Youtube 影片代碼與截圖

抓取 YouTube 影片的相關資料,可以使用官方提供的 YouTube Data API,不過還有另外一個方法,直接透過搜尋的方式,擷取影片代碼值,拼湊出相關內容。以下分三個部分介紹


抓取 YouTube 影片代碼

基本上就是用爬蟲程式到 YouTube 搜尋,然後把結果中的影片代碼取下來。舉例來說,打上關鍵字搜尋「周杰倫」,會看見有廣告、播放清單 (Playlist) 與單一影片,如下圖:

youtube1 - [Python] 抓取 Youtube 影片代碼與截圖

看一下上方的網址列,這個結果頁面的網址為

https://www.youtube.com/results?search_query=周杰倫

因此我們可以把他當作 API,直接去爬這個頁面的內容,抓出超連結的部分

import re
import requests
from bs4 import BeautifulSoup

string = "周杰倫";

url = "https://www.youtube.com/results?search_query=" + string
res = requests.get(url, verify=False)
soup = BeautifulSoup(res.text,'html.parser')

for entry in soup.select('a'):
    m = re.search("v=(.*)", entry['href'])
    if m:
        print m.group(1)

因為影片的連結後面都會接hash值(格式如下),所以透過beautifulsoup抓出來。附帶一題,廣告的url和其他兩者不同,所以在抓取代碼的時候可以不管他。

https://www.youtube.com/watch?v=[hash值]

youtube2 - [Python] 抓取 Youtube 影片代碼與截圖

發現連結有重複,而且 PlayList 都很長一串,因此把相同的過濾,並把 PlayList 拿掉,這樣就能得到影片 hash 值拉!

import re
import requests
from bs4 import BeautifulSoup

string = "周杰倫";

url = "https://www.youtube.com/results?search_query=" + string
res = requests.get(url, verify=False)
soup = BeautifulSoup(res.text,'html.parser')
last = None

for entry in soup.select('a'):
    m = re.search("v=(.*)",entry['href'])
    if m:
        target = m.group(1)
        if target == last:
            continue
        if re.search("list",target):
            continue
        last = target
        print target

youtube3 - [Python] 抓取 Youtube 影片代碼與截圖


顯示 YouTube 截圖

我們將影片上傳 YouTube 後,系統會自動產生 4 張快照縮圖,分別位於影片開始、中間與結尾,舉例來說,如果影片 hash 值為lskSj1f6ZsY,那麼影片網址就如同剛的格式一樣,watch 後面接 hash 值。 影片網址:

https://www.youtube.com/watch?v=lskSj1f6ZsY

縮圖網址如下:

http://i.ytimg.com/vi/lskSj1f6ZsY/0.jpg
http://i.ytimg.com/vi/lskSj1f6ZsY/1.jpg
http://i.ytimg.com/vi/lskSj1f6ZsY/2.jpg
http://i.ytimg.com/vi/lskSj1f6ZsY/3.jpg

1.jpg ~ 3.jpg 分別為前中後縮圖,而 0.jpg 則是 2.jpg 的大圖 (480 x 360),以下是在 jsfiddle 執行的結果

youtube4 - [Python] 抓取 Youtube 影片代碼與截圖

直接看範例:jsfiddle youtube-img sample 

當影片上傳後,系統就會產生這些縮圖,不過如果你將影片設為私密影片看不看得到呢? 原本還想說有保密性吧? 不過經過傑瑞的測試,私密影片仍然看的到縮圖的阿,實在有點意外這樣的權限設定 …

這個在 2010 的一篇文章就有提到:如何偷窥加密的 YouTube 视频?(已失連),有興趣可以看看


顯示 YouTube 影片

有了 hash 值後,可以直接用 iFrame 的方式嵌入網頁之中

src="//www.youtube.com/embed/[hash值]"
<iframe
class="video w100"
src="//www.youtube.com/embed/lskSj1f6ZsY"
frameborder="0"
allowfullscreen>
</iframe>

參考資料

Jerry
Jerry

樂於分享的軟體工程師,曾在新創與大型科技公司實習,獲得黑客松競賽冠軍,擔任資安研討會講者。長期熱衷於資訊安全、雲端服務、網路行銷等領域,希望將科技知識分享給更多人。內容轉載請來信:jlee58tw@gmail.com

發表回應