Python之点到为止: 下载Youtube视频

2019年04月06日 6648点热度 0人点赞 0条评论

作为一个新晋搬运UP主
能做的就是尽可能的保证“同步更新”!

注:以下内容可能会造成小白不适,请适当观看

需要准备得:

  1. Python
  2. requests
  3. BeautifulSoup
  4. youtube_dl

先分析下YouTube:

比如:油管上NBA视频,
https://www.youtube.com/user/NBA/videos
默认给出该用户最近上传的30个视频,往下拖动发现是瀑布流ajax加载数据
因为本教程只考虑最新的视频,老视频不考虑所以这个接口对我们来说意义不大
当然你如果想要爬YouTube全站就另说了。

紧接着看一下源代码,浏览器直接右键查看源代码就行了。

发现视频信息放在一个 script 的标签内 一个window下的变量内
随后有了如下代码:

import requests
from bs4 import BeautifulSoup
url = 'https://www.youtube.com/user/NBA/videos'
proxies = {
    "http": "http://127.0.0.1:10086",
    "https": "http://127.0.0.1:10086",
}
res = requests.get(url, proxies=proxies)
print(res.text.find('window["ytInitialData"]')) 

运行之后输出的-1,竟然并没有找到这个 “window["ytInitialData"]” 这个字符串
用Postman调试了一下,发现如果请求头没有带 User-Agent ,就回给你返回一个完整的格式化好的html,就没有这些js数据了,其实也是可以使用 BeautifulSoup 直接进行格式化的。
只是之前找到了一个js的开头那就要继续下去。

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 (KHTML, like Gecko) '
    'Chrome/74.0.3702.0 Safari/537.36'
}
res = requests.get(url, proxies=proxies, headers=headers) 

加上请求头之后,就可以找到那段js代码的位置了。
紧接着我们把重要的数据拿出来,

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 (KHTML, like Gecko) '
    'Chrome/74.0.3702.0 Safari/537.36'
}
res = requests.get(url, proxies=proxies, headers=headers) 

分析过程不难,我们知道他将数据放入了 script 标签中,那就用BeautifulSoup取出所有 script 标签,一共有15个(可能不一样无所谓的),测试之后发现这段代码总在倒数第三个script 标签内,所以直接取 [-3].
第四行代码就是将实际的json数据取出来,其他的js代码我们不要
后两行为解析json数据并只将视频信息部分取出来

循环输出以下发现这个item里面存放了,视频ID、预览图、访问量等等等一些数据。
随后就回到了我们今天的主题,如何保证我们的视频是最新的。
拿到了最新的视频列表,就可以写个死循环定时得去爬取。
和原来的数组去对比,如果有差异那那个视频就是最新的。
根据视频ID,再利用 youtube_dl 就可以直接将视频下载到本地

youtube_dl ,也是用Python写的所以调用起来也非常方便
能实现得呢就是,定时爬取该用户上传得视频。
有更新得时候直接将视频和预览图下载到本地!
你只需要做的就是上传视频。没了

那么我就点到为止了
Just give a hint.

文章评论