热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫进阶之爬取某视频并下载,没有广告的视频看起来不爽吗?

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理本文章来着腾讯云作者:python学习教程意外的挖掘到了一个资源

Python爬虫进阶之爬取某视频并下载,没有广告的视频看起来不爽吗?[Python基础]

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

本文章来着腾讯云 作者:python学习教程
在这里插入图片描述

意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法。

下面说说流程:

一、网站分析

首先进入网站,F12检查,本来以为这种低端网站很好爬取,是我太低估了web主。可以看到我刷新网页之后,出现了很多js文件,并且响应获取的代码与源代码不一样,这就不难猜到这个网站是动态加载页面。
在这里插入图片描述
目前我知道的动态网页爬取的方法只有这两种:

1、从网页响应中找到JS脚本返回的JSON数据;

2、使用Selenium对网页进行模拟访问。

二、写代码

导入相关模块

import requestsfrom datetime import datetimeimport re#import jsonimport timeimport os #视频分类和视频列表URL的前一段url = "http://xxxxxxx/api/?d=pc&c=video&"#m3u8文件和ts文件的URL前一段m3u8_url ="https://xxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/"#构造请求头信息header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"}#创建空列表存放视频信息vediomassag=""#返回当前时间戳TimeStamp = int(datetime.timestamp(datetime.now()))

2.定义函数,获取网站首页分类列表信息

#自定义函数获取分类def get_vediocategory(url, TimeStamp):cgURL = url + "m=categories×tamp=" + str(TimeStamp) + "&"respOnse= requests.get(cgURL, headers=header)category = response.text# strrr=""%s""%category# return strrrreturn category

3.定义函数,通过上一个函数返回的分类信息,根据分类对应的id,输入id并传输到当前URL中以便获取分类下的视频列表信息

#获取分类后的视频列表def get_vedioList(url, TimeStamp, tagID):listURL = url + "m=lists×tamp=" + str(TimeStamp) + "&" + "page=1&tag_id=" + str(tagID) + "&sort_type=&is_vip=0"respOnse= requests.get(listURL, headers=header)vedioLists = response.textreturn vedioLists

4.在视频列表信息中获取视频对应的id,获取单个视频详细信息的URL

#获取单个视频的详细信息def get_vediomassages(url, TimeStamp, vedioID):videoURL = url + "m=detail×tamp=" + str(TimeStamp) + "&" + "&id=" + str(vedioID)respOnse= requests.get(videoURL, headers=header)vediomassag = response.textreturn vediomassag

5.在视频详细信息中找到m3u8文件的下载地址,并将文件保存到创建的文件中

#将下载的m3u8文件放进创建的ts列表文件中def get_m3u8List(m3u8_url,vediomassag):lasturl = r""m3u8_720_url":"(.*?)","download_url"last_url =re.findall(lasturl,vediomassag)lastURL=m3u8_url+str(last_url)respOnse= requests.get(lastURL, headers=header)tsList = response.textcur_path="E:files" #在指定路径建立文件夹try:if not os.path.isdir(cur_path): #确认文件夹是否存在os.makedirs(cur_path) #不存在则新建except:print("文件夹存在")filename=cur_path+" 2.txt" #在文件夹中存放txt文件f = open(filename,"a", encoding="utf-8")f.write(tsList)f.closeprint("创建%s文件成功"%(filename))return filename

6.将m3u8文件中的ts单个提取出来放进列表中。

# 提取ts列表文件的内容,逐个拼接ts的url,形成listdef get_tsList(filename):ls = []with open(filename, "r") as file:line = f.readlines()for line in lines:if line.endswith(".ts

"):ls.append(line[:-1])return ls

7.遍历列表获取单个ts地址,请求下载ts文件放进创建的文件夹中

# 批量下载ts文件def DownloadTs(ls):length = len(ls)root="E:mp4"try:if not os.path.exists(root):os.mkdir(root)except:print("文件夹创建失败")try:for i in range(length):tsname = ls[i][:-3]ts_URL=url+ls[i]print(ts_URL)r = requests.get(ts_URL)with open(root, "a") as f:f.write(r.content)f.close()print("" + tsname + " -->OK ({}/{}){:.2f}%".format(i, length, i * 100 / length), end="")print("下载完毕")except:print("下载失败")

代码整合

import requestsfrom datetime import datetimeimport re#import jsonimport timeimport os url = "http://xxxxxxxx/api/?d=pc&c=video&"m3u8_url ="https://xxxxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/"header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"}vediomassag=""TimeStamp = int(datetime.timestamp(datetime.now())) #自定义函数获取分类def get_vediocategory(url, TimeStamp):cgURL = url + "m=categories×tamp=" + str(TimeStamp) + "&"respOnse= requests.get(cgURL, headers=header)category = response.text# strrr=""%s""%category# return strrrreturn category #获取分类后的视频列表def get_vedioList(url, TimeStamp, tagID):listURL = url + "m=lists×tamp=" + str(TimeStamp) + "&" + "page=1&tag_id=" + str(tagID) + "&sort_type=&is_vip=0"respOnse= requests.get(listURL, headers=header)vedioLists = response.textreturn vedioLists #获取单个视频的详细信息def get_vediomassages(url, TimeStamp, vedioID):videoURL = url + "m=detail×tamp=" + str(TimeStamp) + "&" + "&id=" + str(vedioID)respOnse= requests.get(videoURL, headers=header)vediomassag = response.textreturn vediomassag #将下载的m3u8文件放进创建的ts列表文件中def get_m3u8List(m3u8_url,vediomassag):lasturl = r""m3u8_720_url":"(.*?)","download_url"last_url =re.findall(lasturl,vediomassag)lastURL=m3u8_url+str(last_url)respOnse= requests.get(lastURL, headers=header)tsList = response.textcur_path="E:files" #在指定路径建立文件夹try:if not os.path.isdir(cur_path): #确认文件夹是否存在os.makedirs(cur_path) #不存在则新建except:print("文件夹存在")filename=cur_path+" 2.txt" #在文件夹中存放txt文件f = open(filename,"a", encoding="utf-8")f.write(tsList)f.closeprint("创建%s文件成功"%(filename))return filename # 提取ts列表文件的内容,逐个拼接ts的url,形成listdef get_tsList(filename):ls = []with open(filename, "r") as file:line = f.readlines()for line in lines:if line.endswith(".ts

"):ls.append(line[:-1])return ls # 批量下载ts文件def DownloadTs(ls):length = len(ls)root="E:mp4"try:if not os.path.exists(root):os.mkdir(root)except:print("文件夹创建失败")try:for i in range(length):tsname = ls[i][:-3]ts_URL=url+ls[i]print(ts_URL)r = requests.get(ts_URL)with open(root, "a") as f:f.write(r.content)f.close()print("" + tsname + " -->OK ({}/{}){:.2f}%".format(i, length, i * 100 / length), end="")print("下载完毕")except:print("下载失败") """# 整合所有ts文件,保存为mp4格式(此处函数复制而来未做实验,本人直接在根目录命令行输入copy/b*.ts 文件名.mp4,意思是将所有ts文件合并转换成自己命名的MP4格式文件。)def MergeMp4():print("开始合并")path = "E://mp4//"outdir = "output"os.chdir(root)if not os.path.exists(outdir):os.mkdir(outdir)os.system("copy /b *.ts new.mp4")os.system("move new.mp4 {}".format(outdir))print("结束合并")"""if __name__ == "__main__":# 将获取的分类信息解码显示出来# print(json.loads(get_vediocategory(url, TimeStamp)))print(get_vediocategory(url, TimeStamp))tagID = input("请输入分类对应的id")print(get_vedioList(url, TimeStamp, tagID))vedioID = input("请输入视频对应的id")get_vediomassages(url, TimeStamp, vedioID)get_m3u8List(m3u8_url,vediomassag)get_tsList(filename)DownloadTs(ls)# MergeMp4()

此时正在下载

在这里插入图片描述


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
author-avatar
谁的板砖在飞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有