Python技术迷

用Python实现实时显示视频下载进度!

来源:pythonall

在下载懂车帝视频的时候,我们需要实时进度条,这可以帮助我们更直观的看到视频的下载进度

Image

下载好的视频。如下图所示

Image

具体实现步骤,概括起来主要有两点:

  • cookie绕过登录过程

这个方法非常实用,还记得我们如何爬公众号的文章吗 只需十几行代码,轻松爬取公众号文章 ,也是cookie绕过登录

  • tqdm可视化显示下载进度

进度条的文章python技术公众号我记得是发过的,但是半年前的文章了,怎么找方便呢?

专属福利 

👉点击领取:最全Python资料合集

这时我们上周爬的200篇公众号文章就发挥作用了:

http://ssw.fit/ 阅览室-公众号,搜索“进度条”

Image

不难发现,《几行代码就能实现漂亮进度条,太赞了!》早已介绍过,有了这篇内容就好办了。

下面开始让python帮我们干活。

cookie绕过登录过程

按F12或通过鼠标右键检查,可以看到cookie

Image

视频页面的唯一标识符,通过cookie获取,就是下面这串数字

Image

代码如下

import requestsimport jsonheaders = {    "cookie":"appmsglist_action_3889613222=card; ua_id=Q1Dfu2THA6T9Qr1HAAAAAN_KYa5xTwNmiuqj1Mkl6PY=",    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}def parser():    video_list = []    rep=requests.get('https://www.dongchedi.com/motor/pc/user/collect/list?count=40&cursor=0&content_type=1',timeout=5,headers=headers)    rep.encoding='utf-8'
for item in json.loads(rep.text)['data']['data']: video_list.append('https://www.dongchedi.com/video/'+item['gid']) print(video_list)

运行上面的脚本,得到收藏的视频url合集

['https://www.dongchedi.com/video/7150286063049802270', 'https://www.dongchedi.com/video/7161306839810998815', ...]

但它们并不是真正的视频地址,实际地址位于vedio标签的src属性

接下来就要去获取这些视频链接,我们用scrapy对这些url发送请求。

将url合集放到scrapy的start_urls中,通过xpath获取视频地址:

class VedioSpider(scrapy.Spider):    name = 'vedio'    start_urls = ['https://www.dongchedi.com/video/7150286063049802270', 'https://www.dongchedi.com/video/7161306839810998815',...]
def parse(self, response): global vedio_dict html =etree.HTML(response.text) #视频标题 title = html.xpath('//*[@id="__next"]/div[1]/div/div/div/div[2]/div/div[1]/h1/text()')[0].strip() #视频地址,@src获取vedio标签的src属性 x = html.xpath('//*[@id="__next"]/div[1]/div/div/div/div[1]/div[1]/div/div[1]/div/div/div/video/@src') vedio_dict[title] = x[0] print(vedio_dict)

输出得到标题和视频地址:

Image

到这里我们已经成功了三分之二,接下来用一个炫酷的进度条

可视化显示下载进度

视频文件过大,立即下载会导致内存不足,设置requests的stream参数为True

设置成True时,它不会立即开始下载,使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。

import osimport requestsfrom tqdm import tqdm
VIDEO_PATH = r'videos'def download(url,fname): # 用流stream的方式获取url的数据 resp = requests.get(url, stream=True) total = int(resp.headers.get('content-length', 0)) with open(fname, 'wb') as file, tqdm( desc=fname, total=total, unit='iB', unit_scale=True, unit_divisor=1024, ) as bar: for data in resp.iter_content(chunk_size=1024): size = file.write(data) bar.update(size)

if __name__ == "__main__": vedio_dict = {'沉浸式试车-2023款大众朗逸': 'https://vxtos', '苑叔试驾新款福特探险者,科技配置有升级,大车也有操控感': 'https://v3-default',} for video_name, url in vedio_dict.items(): video_full_path = os.path.join(VIDEO_PATH,"%s.mp4" % video_name) download(url, video_full_path)

我的网速比较快,平均3M/s,5G视频很快就下载好了!

Image
 1
Image
热门推荐
Image