抓取 YouTube 影片的相關資料,可以使用官方提供的 YouTube Data API,不過還有另外一個方法,直接透過搜尋的方式,擷取影片代碼值,拼湊出相關內容。以下分三個部分介紹
抓取 YouTube 影片代碼
基本上就是用爬蟲程式到 YouTube 搜尋,然後把結果中的影片代碼取下來。舉例來說,打上關鍵字搜尋「周杰倫」,會看見有廣告、播放清單 (Playlist) 與單一影片,如下圖:
看一下上方的網址列,這個結果頁面的網址為
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值]
發現連結有重複,而且 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
顯示 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 執行的結果
直接看範例: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>