20231202_python练习_b站视频爬取(selenium浏览器模拟登录版)

首先手工登录一次获取cookies,然后进行数据保存

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
import json# 创建Chrome浏览器对象
chrome_opt = webdriver.ChromeOptions()
# 开启无界面模式
#chrome_opt.add_argument('--headless')
# 禁用gpu
chrome_opt.add_argument('--disable-gpu')
service = Service('D:/网页数据爬取/selenium练习/chromedriver.exe')
# 创建Chrome浏览器实例
browser = webdriver.Chrome(service=service,options=chrome_opt)#记得写完整的url 包括http和https
browser.get('https://space.bilibili.com/')# 等待页面加载完成
browser.implicitly_wait(10)
#程序打开网页后20秒内手动登陆账户
time.sleep(10)browser.find_element(By.CSS_SELECTOR,'input[type="text"]').send_keys('用户名')
browser.find_element(By.CSS_SELECTOR,'input[type="password"]').send_keys('密码')
#程序打开网页后30秒内手动登陆账户
time.sleep(30)with open('cookies.txt','w') as cookief:#将cookies保存为json格式cookief.write(json.dumps(browser.get_cookies()))
browser.close()

然后使用现有cookies登录用户,进行网页访问,获取清晰视频

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from pprint import pprint
import time
import json
import re
import requests
from moviepy.editor import *# 创建Chrome浏览器对象
chrome_opt = webdriver.ChromeOptions()
# 开启无界面模式
chrome_opt.add_argument('--headless')
# 禁用gpu
chrome_opt.add_argument('--disable-gpu')
service = Service('D:/网页数据爬取/selenium练习/chromedriver.exe')
# 创建Chrome浏览器实例
browser = webdriver.Chrome(service=service,options=chrome_opt)#记得写完整的url 包括http和https
browser.get('https://space.bilibili.com/')
#首先清除由于浏览器打开已有的cookies
browser.delete_all_cookies()with open('cookies.txt','r') as cookief:#使用json读取cookies 注意读取的是文件 所以用load而不是loadscookieslist = json.load(cookief)# 方法1 将expiry类型变为intfor cookie in cookieslist:#并不是所有cookie都含有expiry 所以要用dict的get方法来获取if isinstance(cookie.get('expiry'), float):cookie['expiry'] = int(cookie['expiry'])browser.add_cookie(cookie)#记得写完整的url 包括http和https
browser.get('https://space.bilibili.com/')
#程序打开网页后20秒内手动登陆账户
time.sleep(3)for i in range(96):num = i+1url ='https://www.bilibili.com/video/BV1k94y1J7oJ?p=' + str(num)browser.get(url)# 等待页面加载完成browser.implicitly_wait(10)#网页内容#print(browser.page_source)html_text = browser.page_sourceobj = re.compile(r'<title data-vue-meta="true">(.*?)</title>', re.S)html_biaoti = obj.findall(html_text)[0]  # 从列表转换为字符串biaoti = str(html_biaoti).replace('、', '_').replace(',', '_').replace('/', '').replace(' ', '_').replace('|','').replace('_哔哩哔哩_bilibili', '')# print('html_biaoti:',biaoti)# baseUrl视频地址obj = re.compile(r'window.__playinfo__=(.*?)</script>', re.S)html_data = obj.findall(html_text)[0]  # 从列表转换为字符串# print(html_data)json_data = json.loads(html_data)# 格式化输出,JSON文件美观化#pprint(json_data)# video和audio分别时视频与音频videos = json_data['data']['dash']['video']video_url = videos[0]['baseUrl']audios = json_data['data']['dash']['audio']audio_url = audios[0]['baseUrl']print('video_url', video_url)print('audio_url', audio_url)video_url_m4s = re.compile(r'-\d-\d(.*?).m4s', re.S)video_url_m4s = video_url_m4s.findall(video_url)[0]video_url_m4s = int(video_url_m4s)print('video_url_m4s', video_url_m4s)# cookies做拼接cookies_list = [item["name"] + "=" + item["value"] for item in browser.get_cookies()]cookies = ';'.join(it for it in cookies_list)print(cookies)# 得到cookies后,即可使用requests来做接口爬虫headers = {'Cookie': f'{cookies}',"Referer": "https://space.bilibili.com/86219219/favlist?spm_id_from=333.788.0.0",'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.51 Safari/537.36'}#判断视频清晰度if video_url_m4s >= 64:resp1 = requests.get(url=video_url, headers=headers)with open(biaoti + '.mp4', mode='wb') as f:f.write(resp1.content)resp2 = requests.get(url=audio_url, headers=headers)with open(biaoti + '.mp3', mode='wb') as f:f.write(resp2.content)# 视频音频文件组合video_path = biaoti + '.mp4'audio_path = biaoti + '.mp3'# 提取音轨audio = AudioFileClip(audio_path)# 读入视频video = VideoFileClip(video_path)# 将音轨合并到视频中video = video.set_audio(audio)# 输出video.write_videofile(f"{biaoti}(含音频).mp4")time.sleep(1)# 将涉及MP3MP4清除try:os.remove(video_path)except:passtry:os.remove(audio_path)except:passprint(num, biaoti, '爬取完成')#breaktime.sleep(60)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络入门---网络编程初步认识和实践

目录标题 前言准备工作udpserver.hpp成员变量构造函数初始化函数(socket,bind)start函数(recvfrom) udpServer.ccudpClient.hpp构造函数初始化函数run函数(sendto) udpClient.cc测试 前言 在上一篇文章中我们初步的认识了端口号的作用&#xff0c;ip地址和MAC地址在网络通信时…

QT 中 QProgressDialog 进度条窗口 备查

基础API //两个构造函数 QProgressDialog::QProgressDialog(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *…

面试 Java 基础八股文十问十答第三期

面试 Java 基础八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 21.说下Java8的Stream流的常用方法 答: forEach遍历、find、match进行匹配reduce进行归约&#xff0c;比如求和&#xff0c;乘&#xff0c;除聚合…

base64转PDF

今天做皖事通的对接&#xff0c;下载电子证照后发现回传的是base64&#xff0c;调试确认是个麻烦事&#xff0c;网上搜了一下没有base64转PDF的在线预览功能&#xff0c;只能自己写个调试工具了&#xff0c;以下是通过纯JS方式写的代码&#xff0c;可直接拿去使用&#xff1a; …

com.intellij.openapi.application.ApplicationListener使用

一般监听期通过如下代码生效 <applicationListeners> <!-- <listener class"com.itheima.taunt.MyApplicationListener"--> <!-- topic"com.intellij.openapi.application.ApplicationListener"…

淘宝用户体验VOC标签体系

本专题共10篇内容&#xff0c;包含淘宝APP基础链路过去一年在用户体验数据科学领域&#xff08;包括商详、物流、性能、消息、客服、旅程等&#xff09;一些探索和实践经验。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升&#xff1b;在物流侧洞察用户求助时间与…

计算机组成原理笔记——存储器(静态RAM和动态RAM的区别,动态RAM的刷新, ROM……)

■ 随机存取存储器 ■ 1.随机存取存储器&#xff1a;按存储信息的原理不同分为&#xff1a;静态RAM和动态RAM 2.静态RAM&#xff08;SRAM&#xff09;&#xff1a;用触发器工作原理存储信息&#xff0c;但电源掉电时&#xff0c;存储信息会丢失具有易失性。 3.存储器的基本单元…

springboot监听器模式源码精讲

1.前言 很多时候我们看源码的时候看不下去&#xff0c;其中一个原因是系统往往使用了许多设计模式&#xff0c;如果你不清楚这些设计模式&#xff0c;这无疑增加了你阅读源码的难度。 springboot中就大量使用了设计模式&#xff0c;本文主要介绍其中的一种监听器模式&#xf…

网络安全领域的12个大语言模型用例

网络安全是人工智能最大的细分市场&#xff0c;过去几年网络安全厂商纷纷宣称整合了人工智能技术&#xff08;当然也有很多仅仅是炒作&#xff09;&#xff0c;其中大部分是基于基线和统计异常的机器学习。 随着ChatGPT和类似生成式人工智能技术的飞速发展&#xff0c;基于大语…

算法实战应用案例精讲-『机器学习』scikit-learn 工具库应用详解

目录 机器学习库Scikit-learn库使用 SKLearn入门与简单应用案例 引言 1.SKLearn是什么 2.安装SKLearn 3.SKLea

数学建模-基于BL回归模型和决策树模型对早产危险因素的探究和预测

整体求解过程概述(摘要) 近年来&#xff0c;全球早产率总体呈上升趋势&#xff0c;在我国&#xff0c;早产儿以每年 20 万的数目逐年递增&#xff0c;目前早产已经成为重大的公共卫生问题之一。据研究,早产是威胁胎儿及新生儿健康的重要因素&#xff0c;可能会造成死亡或智力体…

深度学习 -- 神经网络

1、神经网络的历史 2、 M-P模型 M-P模型是首个通过模仿神经元而形成的模型。在M-P模型中,多个输入节点对应一个输出节点y。每个输入x,乘以相应的连接权重w,然后相加得到输出y。结果之和如果大于阈值h,则输出1,否则输出0。输入和输出均是0或1。 公式2.1&#xff1a; …

Redis 安装部署

文章目录 1、前言2、安装部署2.1、单机模式2.1.1、通过 yum 安装&#xff08;不推荐&#xff0c;版本老旧&#xff09;2.1.1、通过源码编译安装&#xff08;推荐&#xff09; 2.2、主从模式2.3、哨兵模式2.4、集群模式2.5、其他命令2.6、其他操作系统 3、使用3.1、Java 代码 —…

神经网络中的 Grad-CAM 热图(Gradient-weighted Class Activation Mapping)

Grad-CAM&#xff08;Gradient-weighted Class Activation Mapping&#xff09;是一种用于可视化卷积神经网络&#xff08;CNN&#xff09;中特定类别的激活区域的方法。其基本思想是使用网络的梯度信息来获取关于特定类别的空间定位信息。 Grad-CAM 的具体公式如下&#xff1…

【Android】Window和WindowManager

文章目录 理解Window和WindowManagerWindow和WindowManagerWindow的内部机制Window的添加过程Window的删除过程Window的更新过程 Window的创建过程Activity的Window创建过程Dialog的Window创建过程Toast的Window创建过程 理解Window和WindowManager Window是一个抽象类&#xf…

Python逐步打造惊艳的折线图

大家好&#xff0c;Matplotlib可以快速轻松地使用现成的函数绘制图表&#xff0c;但是微调步骤需要花费更多精力。今天本文将介绍如何使用Matplotlib绘制吸引人的图表&#xff0c;实现折线图的惊艳变身。 1.数据 为了说明方法&#xff0c;本文使用了包含过去50年各国GDP信息的…

[iOS]常用修饰符详解

一、内存管理修饰符 这些修饰符主要用于管理对象的内存&#xff0c;包括引用计数和生命周期。 1.strong strong是一个引用计数修饰符&#xff0c;用于对象的属性&#xff0c;这是默认的属性修饰符。当你将一个对象赋值给一个strong属性时&#xff0c;该对象的引用计数会增加…

3090微调多模态模型Qwen-VL踩坑

本人使用记录一下训练过程中的心得和bug 1.数据集准备 数据集的标签形式见官方readme,如下: [{"id": "identity_0","conversations": [{"from": "user","value": "你好"},{"from": "…

如何理解函数指针

如何理解函数类型C 定义函数类型定义一个函数指针类型直接调用函数指针 定义函数类型 typedef int (MyFunction)(int a, int b);可以理解成定义了一个具有2个int类型的传入参数以及返回一个int类型的变量的函数类型>这只是对于函数类型的定义 如果要声明一个函数指针我们需…

QT 中 QTimer 类 备查

基础 // 指定了父对象, 创建的堆内存可以自动析构 QTimer::QTimer(QObject *parent nullptr);// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔 void QTimer::start();// 启动或重新启动定时器&#xff0c;超时间隔为msec毫秒。 void QTimer::…