已离职,无任何利益相关,请放心食用
公司具体网址均已作脱敏处理,防止恶意爬虫攻击
(我都被自己感动了55555)

前言

搞社会实践(da gong)的地方是做网站的,公司把视频放到了*拍短视频的服务器上,通过在自有的页面中引用链接来给别人看。然而,在前几天,*拍把公司的视频引用链接给ban了,客户无法在浏览器上看网页中的视频,但是单独通过视频链接还是可以看的。为了客户能正常观看视频,公司决定将视频手动下载,转移到自有的服务器上。

我说停停,能不能给我二十几首歌的时间,我来整一个自动下载。

技术路线:python3.8; requests, re.

import requests
import re

效果图:

实现方案

大概要做这么一些事:
获取文章页面,分析文章页面的源代码,从源代码中找出视频链接,通过视频链接下载视频,循环以上过程。

1、获取文章源代码

通过观察文章列表,发现每个文章有个唯一的id,那就是说,有可能可以通过id来获取文章链接,从而下载文章源代码。
公司在公网上的url:

https://域名/yushi/manao/10000.html
https://域名/shuijing/caomeijing/10086.html

文章链接中确实有文章的id。然而,文章是分类生成的,被系统放到了不同的目录中,这给单独使用id获取页面源代码设置了障碍。

一上来找不到链接,卡在了第一步属实难受,二十几首歌的时间有限,我慌张地后台胡乱翻找翻找,直到发现了这个:

内部预览链接

https://域名/管理系统/plus/view.php?aid=10000
https://域名/管理系统/plus/view.php?aid=10086

这个链接就很整齐美观,非常适合爬虫的胃口。这样可以确定文章链接了,获取文章页面及其源代码了:

url = f'https://域名/管理系统/plus/view.php?aid={id}'

2、获取文章页面

人在江湖飘,不得不给自己套上一层伪装,网上冲浪也是。让机器人去做事总有点不放心,需要让它装成一个用浏览器的人。
设置全局User Agent :

userAgent = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:91.0) \
Gecko/20100101 Firefox/91.0'
}

创建一个获取页面文本内容的函数,获取并返回url链接的网页文本的内容,并输出正在获取的url对应的文章id,如遇错误,返回空字符串,输出错误信息。

def getPage(url , id):print(f"Geting '{id}'.")try:response = requests.get(url, headers= userAgent)response.encoding = 'utf-8'response = response.textreturn responseexcept:print(f"'{id}' get error!")return ''

@url: 字符串,待爬取的网页链接
@id: 字符串,所爬取的文章id

3、分析源码获取视频链接

我html不怎么会,标签辣么多我也没时间看。既然是找视频那就直接冲mp4吧,一搜索还真有两个,比对了一下两个是一样的。


正则表达式直接匹配不用分析了

r'http.+?mp4'

http开头,mp4结尾,中间要有东西,如果匹配到了多个,取最短的。
创建一个获取视频链接的函数,从text文本内容中获取并返回视频链接,如遇错误,返回空字符串,输出错误信息。

def getUrl(id, text):try:pat = re.compile(r'http.+?mp4')url = re.findall(pat, text)url = url[0]return urlexcept:print(f"'{id}' re match error!")return ''

@id: 字符串,所爬取的文章id
@text: 字符串,用于查找视频链接的网页源码

4、下载和保存视频

视频和一般网页内容不一样,是个二进制文件。区别于页面源代码的text属性,在从服务器响应中获取时,requests库中,需要用到Response类的content属性。在保存文件时,也不能单独使用‘w'写入模式,需要使用’wb'这个二进制写入模式。
创建一个下载和保存视频的函数,将在url链接的视频以'name.mp4'的名字保存在videos文件夹,如遇错误,记录错误后输出错误信息。

def saveVideo(url, name):try:response = requests.get(url, stream= 1, headers= userAgent)response = response.content # 二进制访问视频file = open(f'./videos/{name}.mp4', 'wb') # 二进制文件模式file.write(response)file.close()except:errorIDs.append(name)print(f"{name} save video error!")

@url: 字符串,视频链接
@name:字符串,视频的名称

5、完善逻辑

剩下完善整个程序的逻辑,把函数放在一起就好了。

file = open('ids.txt', 'r', encoding= 'utf-8')
ids = file.readlines()
file.close()

将要下载的文章id放在一个文件里,通过文件的方式输入,更稳健。遍历所有文章id,逐个下载。

for id in ids:id = id.strip()url = f'https://域名/管理系统/plus/view.php?aid={id}'webPage = getPage(url , id)videoUrl = getUrl(id, webPage)saveVideo(videoUrl, id)print(f'{id} completed!')
print("Finish!")

展示运行的结果,并保持结果持续显示:

if len(errorIDs) != 0:print("error IDs:")for id in errorIDs:print(id, end=' ')print('\n')
else : print('No error.')
​
Ispause = 1
while 1 :Ispause = input()if Ispause == 'exit' : break 

完整代码,3kB不到,自动爬~

import requests
import re
​
userAgent = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'
}
errorIDs = []
​
def getPage(url , id):'''获取并返回url链接的网页文本的内容,并输出正在获取的url对应的文章id,如遇错误,返回空字符串,输出错误信息。@url: 字符串,待爬取的网页链接@id: 字符串,所爬取的文章id''' print(f"Geting '{id}'.")try:response = requests.get(url, headers= userAgent)response.encoding = 'utf-8'response = response.textreturn responseexcept:print(f"'{id}' get error!")return ''
​
def getUrl(id, text):'''从text文本内容中获取并返回视频链接,如遇错误,返回空字符串,输出错误信息。@id: 字符串,所爬取的文章id@text: 字符串,匹配视频链接的网页内容'''try:pat = re.compile(r'http.+?mp4')url = re.findall(pat, text)url = url[0]return urlexcept:print(f"'{id}' re match error!")return ''def saveVideo(url, name):'''将在url的视频以'name.mp4'的名字保存在videos文件夹,如遇错误,记录错误后输出错误信息。@url: 字符串,视频链接@name:字符串,视频的名称'''try:response = requests.get(url, stream= 1, headers= userAgent)response = response.contentfile = open(f'./videos/{name}.mp4', 'wb')file.write(response)file.close()except:errorIDs.append(name)print(f"{name} save video error!")
​if __name__=='__main__':# 读取需要获取视频的文章idfile = open('ids.txt', 'r', encoding= 'utf-8')ids = file.readlines()file.close()
​# 获取视频for id in ids:id = id.strip()url = f'https://域名/管理系统/plus/view.php?aid={id}'webPage = getPage(url , id)videoUrl = getUrl(id, webPage)saveVideo(videoUrl, id)print(f'{id} completed!')print("Finish!")
​# 展示运行结果if len(errorIDs) != 0:print("error IDs:")for id in errorIDs:print(id, end=' ')print('\n')else : print('No error.')
​# 保持运行结果持续显示Ispause = 0while 1 :Ispause = input()if Ispause == 'exit' : break 

反思

真正运用到工作中的时候,此程序并不高效。对于没有参与编写的人员,这个小程序不太友好,使用需要建文件夹、创建文件手动输入id,过于麻烦。以至于公司把我作为一个下载器,我一个人处理下载,其他人负责转移,虽提高了一定效率,但仍不是最优解。

需要改进的地方:

1、不能多个下载任务并行处理;
2、不能灵活调整下载位置;
3、没有友好易上手的用户图形界面;
4、不能自动获取文章id;
5、下载失败不会自动重试;
6、没有进度条。

可以尝试一下:

1、不使用正则表达式,使用bs库解析html;
2、使用成熟的scrapy等爬虫框架再开发。

用Python批量下载视频相关推荐

  1. python批量下载b站_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  2. 手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 桃之夭夭,灼灼其华. /1 前言/ ...

  3. 简单python网络爬虫批量下载视频

    寒假闲来无事,决定尝试一下用python写一个小网络爬虫批量下载视频. 由于是第一次写网络爬虫,可以说是两眼一抹黑,整个程序都是自己一点点试出来的,所以程序本身肯定有一些漏洞和缺陷,如果有建议请批评指 ...

  4. 利用python 批量下载美拍视频

    前些日子写了一个利用Python批量下载微博配图的程序,因为是基于微博的移动端,即weibo.cn  ,难度要小很多.而当我面对美拍时却发现,好像有点困难啊. 美拍的页面有很多动态元素,当我们打开某一 ...

  5. python批量下载抖音无水印视频,附软件

    网上很多那种抖音视频解析,去水印下载的网站,不过都只可以下单个,下下来大多数标题还是乱码.一点都不geek. 咱们懒人找资源的粉丝最大的优点就是懒,这种重复性的活python帮咱们搞定. 批量下载抖音 ...

  6. 用Python打造批量下载视频并能可视化下载进度的炫酷下载器

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 吾日三省吾身:为人谋而不忠乎?与朋 ...

  7. python批量下载bilibili视频_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  8. 利用python批量下载美拍视频

    前些日子写了一个利用python批量下载微博配图的程序,因为是基于微博的移动端,即weibo.cn  ,难度要小很多.而当我面对美拍时却发现,好像有点困难啊. 美拍的页面有很多动态元素,当我们打开某一 ...

  9. 手把手教你用Python打造一款批量下载视频并能可视化显示下载!

    /1 前言/ 平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可能会让你无网可上.这个时候那些好看的电视剧和电影自然是无法观看了,本期我们要讲的就是怎样下载这些视频. /2 项目目标/ ...

最新文章

  1. 一个程序员眼中的好UI
  2. one-to-one
  3. F5补丁修复及几点命令
  4. 【NOIP2005】【Luogu1052】过河
  5. laravel--模型中各种属性详解
  6. python科赫雪花正方形_python—科赫曲线(科赫雪花小包裹)
  7. COJ 0359 xjr考考你数据结构(根号2)线段树区间增加
  8. 前端战五渣学JavaScript——深克隆(深拷贝)
  9. 获取局域网远程主机ipv6地址
  10. 手机铃声和图片的详细设计说明
  11. 认识服务器的几大必备知识
  12. LeetCode 110 Balanced Binary Tree
  13. 新能源汽车行业研究报告
  14. 爱车人士必知的一些保养爱车的常识
  15. 导线型号与其载荷电流对照表
  16. OBS 插件推流以及日志模块
  17. CompletableFuture.thenCompose
  18. HTTPS证书品牌,申请与安装
  19. 如何通过github学生包认证(远程不在学校或在校但位置报错均可用)
  20. 区块链最强招聘会来袭,毕业就拿百万年薪!

热门文章

  1. mapreduce运行的bug收录
  2. 推荐算法工程师面试准备
  3. word转pdf保持图片清晰度
  4. 向量语义与静态词嵌入——从tf-idf到GloVe
  5. 1、junit学习之junit的基本介绍
  6. 我的开车心得-送给马路新人 【转】
  7. 线性最小二乘法拟合 matlab程序,曲线拟合的线性最小二乘法及其MATLAB程序
  8. latex三线表绘制,合并行与列
  9. 模糊查询银行卡号mysql_mysql模糊查询
  10. php怎么改北京时间,php如何设置北京时间