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


抓取youtube影片代碼

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

youtube1

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

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

這邊發現連結有重複,而且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


顯示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

直接看範例: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>


參考資料

Youtube Data API

YouTube 影片的截圖位置