橙子建站电话_网页编辑器的作用是什么_龙岗区住房和建设局_石家庄第二波疫情最新消息 from lxml import etreeclass CrawlVideo:# 构造方法,用于初始化变量值def __init__(self, stat_url=None, headers=None, base_url=None, first_path=None):if stat_url is None:# 视频详情页self.star_url = 'https://www.acfun.cn/v/ac20783544'else:self.star_url = stat_urlif headers is None:# 请求头self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}else:self.headers = headersif base_url is None:# 片段视频前半部分链接self.base_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/'else:self.base_url = base_urlif first_path is None:# 视频存储路径 (注意后面要加 /)self.first_path = 'C:/Users/admin/Desktop/'else:self.first_path = first_path# 视频名称self.video_name = ""# 视频id用作m3u8文件名self.m3u8_name = ""# 获得页面源码数据的方法def get_html_data(self, url=None, head=None):"""获取页面源码的方法:param url: 传入一个视频详情页的url:param head: 传入请求头:return: 返回一个html页面数据"""# 当请求头为空时设置默认值if head is None:head = self.headersif url is None:url = self.star_url# 向详情页发送请求获得响应对象response = requests.get(url=url, headers=head)# 获得详情页源码html_data_text = response.text# 获得详情页的视频id,用作视频命名self.m3u8_name = response.url.split('/')[-1]# 判断视频页面源码文件是否存在,如果存在表示已经将存储过了,不在进行二次存储if not os.path.exists(f'{self.first_path}{self.m3u8_name}.txt'):# 将上面获得的视频id作为文件名,将Html源码存入with open(f'{self.first_path}{self.m3u8_name}.txt', 'w', encoding='utf-8') as f:f.write(html_data_text)# 读取存好页面源码数据with open(f'{self.first_path}{self.m3u8_name}.txt', 'r', encoding='utf-8') as f:# 存入变量中html_data_text = f.read()return html_data_text# 获取所有分段视频链接的方法def get_fragment_url_list(self, data):"""获得所有完整的分段视频链接url:param data: 传入一个视频详情页源码数据:return: 返回一个列表,列表中含有所有分段视频的链接"""# 实力化一个etree对象,用于获取视频的名称tree = etree.HTML(data)# 获得视频的名称self.video_name = tree.xpath("//h1[@class='title']/span/text()")[0]# 输出视频名称print(self.video_name)# 使用正则获得m3u8链接所在的json字符串m3u8_str = re.findall(r'"ksPlayJsonHevc":"(.*?)window.videoResource', data, re.S)[0].strip()[:-1]# 获取各种清晰度的m3u8请求地址m3u8_uri_list = re.findall('"url":"(https://.*?m3u8.*?)",', m3u8_str.replace('\', ''))# 查看各种清晰度的m3u8链接# print(m3u8_uri_list)# 使用列表中的第一个m3u8链接(1080p或其他),获得 m3u8文件 中的所有内容m3u8 = requests.get(url=m3u8_uri_list[0], headers=self.headers).text# print(m3u8)# 将m3u8文件中的所有文本数据存入文件中with open(f'{self.first_path}{self.m3u8_name}_list.txt', 'w', encoding='utf-8') as f:f.write(m3u8)# 将m3u8文件中的每行数据存入列表中with open(f'{self.first_path}{self.m3u8_name}_list.txt', 'r', encoding='utf-8') as f:m3u8_str_list = f.readlines()# 获取每段视频对应的m3u8链接# 循环读取每行数据,排除以# 开头的行# 对其他符合要求的行进行去除空格,并拼接前半部分URL(前半部分可以从F12异步加载的m3u8中分析获得)fgt_url_list = [self.base_url + line.strip() for line in m3u8_str_list if not line.startswith("#")]# 查看所有的分段的视频下载链接print(fgt_url_list)return fgt_url_list# 将每个片段的视频循环写入文件中的函数def append_fragment(self, fil, lst, v_typ=''):"""循环将文件写入一个文件的方法 (另一种分段链接视频的方法):param v_typ: 传入一个前半部分的补充链接:param fil: 传入一个视频存入位置的文件对象:param lst: 传入分段视频链接列表:return: None"""# 循环对视频分段链接发送请求for u in lst:# 重新对分段链接进行修改u = u.replace(self.base_url, (self.base_url + v_typ))print(u)# 获得每个分段的二进制响应数据res = requests.get(url=u, headers=self.headers).content# sleep(0.5)# 将每个分段的响应数据最佳到文件中fil.write(res)# 保存视频的方法def save_video(self, fra_url_list):"""将所有分段视频保存到一个文件中的方法:param fra_url_list: 传入一个分段视频列表:return: None"""# 如果本地中没有这个路径,表示该视频没有下载过,让他下载到本地if not os.path.exists(f'{self.first_path}{self.video_name}.mp4'):# 打开一个文件用于存放视频,模式为追加模式file = open(f'{self.first_path}{self.video_name}.mp4', 'ab')# 调用方法将所有片段存入文件中self.append_fragment(file, fra_url_list)# 判断文件中是否有内容,如果没有则对链接进行修改,再次发送请求if os.path.getsize(f'{self.first_path}{self.video_name}.mp4') == 0:# 调用方法将所有片段存入文件中self.append_fragment(file, fra_url_list, v_typ='hls/')# 刷新硬盘,将数据存入file.flush()# 关闭文件file.close()print("下载完成")# 将之前下载的页面源码文件和m3u8文件删除if os.path.exists(f"{self.first_path}{self.m3u8_name}.txt"):os.remove(f"{self.first_path}{self.m3u8_name}.txt")if os.path.exists(f"{self.first_path}{self.m3u8_name}_list.txt"):os.remove(f"{self.first_path}{self.m3u8_name}_list.txt")if __name__ == '__main__':# 实例化一个爬取视频的对象crawl = CrawlVideo()# 获得爬取对象中的get_html方法获得页面的源码数据html_data = crawl.get_html_data()# 获得所有分段视频的下载链接fragment_url_list = crawl.get_fragment_url_list(html_data)# 将所有的分段视频下载,并保存到一个文件中crawl.save_video(fragment_url_list)">

seo服务靠谱吗

泰州网站建设系统、网络系统管理与维护形考任务答案、永久使用、不限域名、海口专业网站建设

建设网站用的软件?

橙子建站电话_网页编辑器的作用是什么_龙岗区住房和建设局_石家庄第二波疫情最新消息

  • 概述:Eclipse是一个流行的开源Java集成开发环境(IDE),通过安装Eclipse Web Tools Platform(WTP)插件,可以非常方便地支持JSP开发。
  • 功能:提供代码编辑、自动补全、调试、项目管理等功能。Eclipse的插件生态系统丰富,可以根据需要安装额外的插件来扩展功能。
  • 优势:免费、开源、社区支持强大、功能全面。
html网页制作代码自我介绍石家庄软件制作百度广告太多抖音视频挂小程序怎么赚钱电脑平面设计软件有哪些江门免费做网站建造师注册查询系统华为品牌推广方案国内国际新闻最新消息2021年营业执照年报新沂做网站唐山网站制作价格广告模板在线制作免费北京西站到北京站旅游网站设计代码html免费一站式跨境电商平台搭建平台 资源共享 合作共赢学习软件推荐广州网站建设定制排名asp建站系统iphone14欧美日韩版本价格企业网络推广策划案例福田汽车公司简介琼中网站建设seo优化推广专员招聘工程咨询企业内部网站打不开百度汽车网站网站设计包括哪些方面日本可持续设计产品汕头seo网络推广服务

猜你喜欢

  • 友情链接:
  • 网页设计报告步骤 泰安招聘人才网最新招聘 制造网址需要花多少钱 重庆网站建设公司经营范围 山东潍坊最新消息今天 学校网站设计图