Python爬虫实战:利用代理IP批量下载哔哩哔哩美女视频

文章 目录

  • 1.前言
  • 2.爬取目标
  • 3.准备工作
    • 3.1 环境安装
    • 3.2 代理免费获取
  • 四、爬虫实战分析
    • 4.1 翻页分析
    • 4.2 获取视频跳转链接
    • 4.3 下载视频
    • 4.4 视频音频合并
    • 4.5 完整源码
  • 五、总结

1.前言

粉丝们(lsp)期待已久的Python批量下载哔哩哔哩美女视频教程它终于来了,接下来跟着我的步骤一步步实现即可!

2.爬取目标

本次博主爬取的目标是哔哩哔哩在搜索框输入关键词后的所有视频:

3.准备工作

3.1 环境安装

Python:3.10

编辑器:PyCharm

由于哔哩哔哩的视频和音频是分开的,所以本次我们需要用到moviepy模块进行合并(moviepy 是一个强大的 Python 模块,用于视频编辑,如视频剪辑、视频合成、视频字幕添加、音频处理等),执行下面pip命令进行安装:

pip install requests # 网页数据爬取
pip install moviepy # 用于合并音频和视频

3.2 代理免费获取

由于哔哩哔哩限制很严,为了能正常获取数据,博主使用了代理IP。

1、注册账号:代理IP试用

2、选择查看代理IP产品:

3、有动态IP、静态IP、机房IP、移动代理IP可以选择,博主这里选择是机房IP:

4、配置通道,可以设置IP类型(共享/独享)、IP数、IP来源国家等等:

5、配置完成后可以看到主机、用户名和密码,等下我们添加到代码中去获取IP:

6、下面代码只需要修改刚才获取到的主机、用户名和密码,即可返回代理IP:

import requests  # python基础爬虫库def get_ip():"""获取亮数据代理IP"""host = '你的主机' # 主机user_name = '你的用户名' # 用户名password = '你的密码' # 密码proxy_url = f'http://{user_name}:{password}@{host}' # 将上面三个参数拼接为专属代理IP获取网址proxies = {'http':proxy_url,'https':proxy_url}url = "http://lumtest.com/myip.json" # 默认获取的接口(不用修改)response = requests.get(url,proxies=proxies,timeout=10).text # 发送请求获取IP# print('代理IP详情信息:',response)response_dict = eval(response)  # 将字符串转为字典,方便我们提取代理IPip =  response_dict['ip']# print('IP:',ip)return ipget_ip()

成功返回IP获取成功:

四、爬虫实战分析

4.1 翻页分析

我们搜索关键词后翻页看看链接的规律如下:

第一页链接:

https://search.bilibili.com/all?keyword=%E7%BE%8E%E5%A5%B3%E8%B7%B3%E8%88%9E&from_source=webtop_search&search_source=5

第二页链接:

https://search.bilibili.com/all?vt=67815047&keyword=%E7%BE%8E%E5%A5%B3%E8%B7%B3%E8%88%9E&from_source=webtop_search&search_source=5&page=1&o=30

第三页链接:

https://search.bilibili.com/all?keyword=%E7%BE%8E%E5%A5%B3%E8%B7%B3%E8%88%9E&from_source=webtop_search&search_source=5&page=3&o=60

第四页链接:

https://search.bilibili.com/all?keyword=%E7%BE%8E%E5%A5%B3%E8%B7%B3%E8%88%9E&from_source=webtop_search&search_source=5&page=4&o=90

由上面可以看出规律,我们只需要传入keyword、page和o参数即可:

def main():keyword = '美女跳舞'  # 搜索的关键词page = 1  # 爬取的页数(每页30个视频)jump_url_list = [] # 用于存放搜索页每页的全部视频跳转链接for i in range(1,page+1):if i ==1:url = f'https://search.bilibili.com/all?keyword={keyword}&from_source=webtop_search&search_source=5'else:url = f'https://search.bilibili.com/all?keyword={keyword}&from_source=webtop_search&search_source=5&page={i-1}&o={(i-1)*30}'print(url)

4.2 获取视频跳转链接

1、可以看到所有视频都在一个div下面:

2、然后找到我们要的跳转链接,可以看到在一个a标签下:

3、接下来只需要获取每一个视频跳转链接即可:

def get_jump_url(url,jump_url_list):"""获取视频跳转链接"""headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}# 发送请求response = requests.get(url, headers=headers)# 获取网页源码html_str = response.content.decode()# print(html_str)html_data = etree.HTML(html_str)# 利用xpath取到所有的li标签div_list = html_data.xpath("//div[@class='video-list row']/div")# 打印一下div标签个数# print(len(div_list))for div in div_list:# 拼接跳转链接jump_url = 'https:'+div.xpath(".//div[@class='bili-video-card__wrap __scale-wrap']/a/@href")[0]# print(jump_url)# 这里限制一下我们需要的跳转链接,排除无用的链接if 'https://www.bilibili.com/video' in jump_url:# 跳转链接存放在列表中jump_url_list.append(jump_url)

5、获取成功检查一下跳转链接是否正常跳转:

没有问题正常打开:

4.3 下载视频

1、首先先找到标题所在标签:

2、视频和音频都藏在script标签里面:

3、遍历我们刚才的跳转链接列表取一个链接进行测试:

def download_video(jump_url_list,keyword):# 遍历我们刚才获取到的所有跳转链接for jump_url in jump_url_list: # 先取一个视频进行测试print('正在下载:',jump_url)# 发送请求headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}# 添加代理IP(这里代理IP这里需要看`3.2 获取代理IP`自己去获取)proxies = get_ip()response = requests.get(jump_url, headers=headers, proxies=proxies)# 视频详情jsonmatch = re.search( '__playinfo__=(.*?)</script><script>',response.text)playinfo =  json.loads(match.group(1))# 视频内容jsonmatch = re.search( r'__INITIAL_STATE__=(.*?);\(function\(\)',response.text)initial_state = json.loads(match.group(1))# 视频分多种格式,直接取分辨率最高的视频 1080pvideo_url = playinfo['data']['dash']['video'][0]['baseUrl']# 取出音频地址audio_url = playinfo['data']['dash']['audio'][0]['baseUrl']title = initial_state['videoData']['title']print('视频名字:',title)# print('视频地址:', video_url)# print('音频地址:', audio_url)# 根据关键词创建文件夹if not os.path.exists(keyword):os.mkdir(keyword)# 下载视频headers.update({"Referer": jump_url})video_content = requests.get(video_url, headers=headers)received_video = 0video_path = f'./{keyword}/{title}_video.mp4'with open(video_path, 'ab') as output:while int(video_content.headers['content-length']) > received_video:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)received_video += len(response.content)# 下载音频audio_content = requests.get(audio_url, headers=headers)received_audio = 0audio_path = f'./{keyword}/{title}_audio.mp4'with open(audio_path, 'ab') as output:while int(audio_content.headers['content-length']) > received_audio:# 视频分片下载headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)

生成指定关键词文件夹,并下载成功视频和音频:

4.4 视频音频合并

这里我们定义一个合并函数,需要传入视频和音频路径即可(注意:合并可能有点慢请耐心等待即可):

def merge_video_audio(video_path, audio_path):"""传入原始视频和音频路径,合并为新的视频,并删除原始视频和音频"""print('视频视频合并中请耐心等待~')# 获取下载好的音频和视频文件vd = VideoFileClip(video_path)ad = AudioFileClip(audio_path)vd2 = vd.set_audio(ad)  # 将提取到的音频和视频文件进行合成output = video_path.replace('_video','')vd2.write_videofile(output)  # 输出新的视频文件# 移除原始的视频和音频os.remove(video_path)os.remove(audio_path)

合并中:

合并成功并删除原始的视频和音频:

4.5 完整源码

下面完整代码需要看3.2获取 并 修改get_ip()函数中的 代理IP信息(主机、用户名和密码),还可以修改关键词和爬取的页数:

import time
import requests
import json
import re
from lxml import etree
from moviepy.editor import *def get_ip():"""获取亮数据代理IP"""host = '你的主机'  # 主机user_name = '你的用户名'  # 用户名password = '你的密码'  # 密码proxy_url = f'http://{user_name}:{password}@{host}'  # 将上面三个参数拼接为专属代理IP获取网址proxies = {'http': proxy_url,'https': proxy_url}url = "http://lumtest.com/myip.json"  # 默认获取的接口(不用修改)response = requests.get(url, proxies=proxies, timeout=10).text  # 发送请求获取IP# print('代理IP详情信息:',response)response_dict = eval(response)  # 将字符串转为字典,方便我们提取代理IPip = response_dict['ip']# print('IP:',ip)return ipdef get_jump_url(url,jump_url_list):"""获取视频跳转链接"""headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}# 发送请求response = requests.get(url, headers=headers)# 获取网页源码html_str = response.content.decode()# print(html_str)html_data = etree.HTML(html_str)# 利用xpath取到所有的li标签div_list = html_data.xpath("//div[@class='video-list row']/div")# 打印一下div标签个数# print(len(div_list))for div in div_list:# 拼接跳转链接jump_url = 'https:'+div.xpath(".//div[@class='bili-video-card__wrap __scale-wrap']/a/@href")[0]# print(jump_url)# 这里限制一下我们需要的跳转链接,排除无用的链接if 'https://www.bilibili.com/video' in jump_url:# 跳转链接存放在列表中jump_url_list.append(jump_url)def merge_video_audio(video_path, audio_path):"""传入原始视频和音频路径,合并为新的视频,并删除原始视频和音频"""print('原始视频音频合并中,请耐心等待~')# 获取下载好的音频和视频文件vd = VideoFileClip(video_path)ad = AudioFileClip(audio_path)vd2 = vd.set_audio(ad)  # 将提取到的音频和视频文件进行合成output = video_path.replace('_video','')vd2.write_videofile(output)  # 输出新的视频文件# 移除原始的视频和音频os.remove(video_path)os.remove(audio_path)def download_video(jump_url_list,keyword):# 遍历我们刚才获取到的所有跳转链接for jump_url in jump_url_list: # 先取一个视频进行测试print('正在下载:',jump_url)# 发送请求headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}# 添加代理IP(这里代理IP这里需要看`3.2 获取代理IP`自己去获取)proxies = get_ip()response = requests.get(jump_url, headers=headers, proxies=proxies)# 视频详情jsonmatch = re.search( '__playinfo__=(.*?)</script><script>',response.text)playinfo =  json.loads(match.group(1))# 视频内容jsonmatch = re.search( r'__INITIAL_STATE__=(.*?);\(function\(\)',response.text)initial_state = json.loads(match.group(1))# 视频分多种格式,直接取分辨率最高的视频 1080pvideo_url = playinfo['data']['dash']['video'][0]['baseUrl']# 取出音频地址audio_url = playinfo['data']['dash']['audio'][0]['baseUrl']title = initial_state['videoData']['title']print('视频名字:',title)# print('视频地址:', video_url)# print('音频地址:', audio_url)# 根据关键词创建文件夹if not os.path.exists(keyword):os.mkdir(keyword)# 下载视频headers.update({"Referer": jump_url})video_content = requests.get(video_url, headers=headers)received_video = 0video_path = f'./{keyword}/{title}_video.mp4'with open(video_path, 'ab') as output:while int(video_content.headers['content-length']) > received_video:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)received_video += len(response.content)# 下载音频audio_content = requests.get(audio_url, headers=headers)received_audio = 0audio_path = f'./{keyword}/{title}_audio.mp4'with open(audio_path, 'ab') as output:while int(audio_content.headers['content-length']) > received_audio:# 视频分片下载headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)# 合并视频和音频merge_video_audio(video_path, audio_path)print('********************这是一条隔离线***************************')time.sleep(1)  # 限制速度不能太快了,如果还是不行继续增加暂停时间def main():keyword = '美女跳舞'  # 搜索的关键词page = 1  # 爬取的页数(每页30个视频)jump_url_list = [] # 用于存放搜索页每页的全部视频跳转链接for i in range(1,page+1):if i ==1:url = f'https://search.bilibili.com/all?keyword={keyword}&from_source=webtop_search&search_source=5'else:url = f'https://search.bilibili.com/all?keyword={keyword}&from_source=webtop_search&search_source=5&page={i-1}&o={(i-1)*30}'# print(url)get_jump_url(url,jump_url_list)# 翻页休息一秒time.sleep(1)download_video(jump_url_list,keyword)if __name__ == '__main__':main()

下载中:

文件夹下全是视频:

五、总结

代理IP对于爬虫是密不可分的,但使用代理IP需要遵守相关法律法规和目标网站的使用规则,不得进行非法活动或滥用代理IP服务,高质量代理IP可以帮助爬虫正常采集公开数据信息,有需要代理IP的小伙伴可以试试:代理IP免费试用

如有问题,可以关注公众号 “Bright Data亮数据”,发送问题后会有官方客服进行回复:

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

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

相关文章

机器人控制系列教程之运动规划(1)

机械臂的运动 工业机器人的运动&#xff0c;根据其运动轨迹可分为点到点的运动和路径跟踪运动。点到点的运动只关心特点的位置点&#xff0c;而路径跟踪运动关心整个运动路径。 点到点运动 点到点的运动根据目标点的机器人位姿&#xff0c;利用逆向运动学求取机器人各个关节…

低代码平台如何重塑项目管理:效率与创新的新边界

引言 随着数字化转型的加速和技术创新的推动&#xff0c;低代码开发平台在近年来逐渐崭露头角&#xff0c;成为企业和组织加速应用开发和创新的重要工具。低代码平台通过提供可视化的开发环境和预构建的组件&#xff0c;极大地简化了应用程序的开发过程&#xff0c;使非专业开发…

C++学习全教程(day1:变量和数据类型、运算符、流行控制语句)

目录 一、变量和数据类型 1、变量 2、标识符 3、作用域 4、常量 5、数据类型 1.基本数据类型-整型 2.char类型 3.bool类型 4.浮点类型 5.字面值常量 二、运算符 1、算数运算符 2、赋值运算符 3、复合赋值运算符 4、关系和逻辑运算 1.关系运算符 -------结果是…

PointCloudLib NDT3D算法实现点云配准 C++版本

0.实现效果 效果不咋好 ,参数不好调整 1.算法原理 3D NDT(Normal Distributions Transform)算法是一种用于同时定位和地图生成(SLAM)的机器人导航算法,特别适用于三维点云数据的配准。以下是关于3D NDT算法的详细解释: 算法原理 点云划分与分布计算:3D NDT算法首先将…

2024第十三届中国PMO大会主持人介绍

全国PMO专业人士年度盛会 由PMO评论主办的2024第十三届中国PMO大会邀请了到十几位知名企业的PMO和项目管理专家来担任大会主持人。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 主持人介绍 肖杨&#xff0c;国际知名组织级项目管理专家&#xff0c;微薄之力…

武汉星起航:亚马逊全球化布局助力企业拓展国际市场

在当今全球化经济的大背景下&#xff0c;企业如何突破地域限制&#xff0c;将产品推向更广阔的市场&#xff0c;成为了摆在众多企业家面前的重要课题。武汉星起航相信&#xff0c;亚马逊&#xff0c;作为全球最大的在线零售平台之一&#xff0c;以其独特的全球化布局和强大的服…

fidder自动测试cookie脚本

前言 工作在使用fidder抓包时&#xff0c;经常需要找到一个请求携带的cookie中&#xff0c;真正校验了那些cookie&#xff0c;从而在代码中实现写入这些cookie的请求。这个过程除了根据经验快速过滤&#xff0c;就只能一个一个删除测试了。 所以我写了这个脚本&#xff0c;自动…

东南亚本地化游戏

通常&#xff0c;亚洲电子游戏市场首先与中国联系在一起。但最近&#xff0c;分析人士越来越关注一个邻近地区&#xff1a;东南亚。而且有充分的理由。 该地区包括中南半岛、马来群岛和邻近岛屿上的十一个国家。1967年&#xff0c;其中10个国家&#xff08;除东帝汶外&#xf…

全自动封箱机技术革新:效率优化新篇章

在日新月异的物流行业中&#xff0c;全自动封箱机以其高效、精准的特性&#xff0c;成为了不可或缺的关键设备。然而&#xff0c;随着市场竞争的加剧和客户需求的不断升级&#xff0c;如何进一步优化全自动封箱机的效率&#xff0c;成为了行业内外关注的焦点。 一、全自动封箱机…

如何快速绘制logistic回归预测模型的ROC曲线?

详情请点击下方&#xff1a; 零代码课程来了&#xff0c;不需要R语言&#xff0c;快速构建预测模型 临床预测模型&#xff0c;也是临床统计分析的一个大类&#xff0c;除了前期构建模型&#xff0c;还要对模型的预测能力、区分度、校准度、临床获益等方面展开评价&#xff0c;确…

智慧车库管理系统

摘 要 随着城市化进程的不断加快&#xff0c;私家车数量的快速增长给城市交通带来了巨大的挑战&#xff0c;停车问题成为城市交通管理中的一大难题。车辆停车时&#xff0c;在停车场寻找停车位耗时过久&#xff0c;不仅仅浪费用户的时间&#xff0c;还可能引起交通拥堵。城市停…

小程序中this(1)

}, onLoad: function() {}, }) 此时经过编译后模拟器的显示&#xff1a; 这里都容易理解&#xff0c;当点击了button按钮后&#xff0c;触发点击事件执行testfun函数&#xff0c;将test02设置为8&#xff0c;如图&#xff1a; 通过this.data.test028这种方式直接赋值可以吗&…

[深度学习] 门控循环单元GRU

门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;是一种用于处理序列数据的递归神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;变体&#xff0c;它通过引入门控机制来解决传统RNN在处理长序列时的梯度消失问题。GRU与长短期记忆网络&#xff0…

【redis】redis概述

1、定义 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的、内存中的数据结构存储系统。redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)…

基于springboot实现旅游网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游网站系统演示 摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率…

想远程控制手机,用哪个软件好?

很多人都想知道安卓系统或iOS系统要如何实现手机远程控制手机、电脑远程控制手机&#xff0c;分别需要用到什么软件&#xff0c;这篇文章一次说清楚。 注意&#xff0c;安卓系统需要是7.0及以上版本&#xff0c;iOS系统需要是11及以上版本。具体使用步骤请点击关注&#xff0c;…

windows安装Nacos并使用

Nacos&#xff08;前身为阿里巴巴的Nacos Config和Nacos Discovery&#xff09;是一个开源的动态服务发现、配置和服务管理平台&#xff0c;由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括&#xff1a;…

基于React18+Appwrite实现类似Instagram的社交APP

源码地址&#xff1a;https://github.com/sikichan/Ins-social-media-app 请给我一个Star ⭐️ 谢谢&#xff01;

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源&#xff1a; https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总&#xff1a; 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…

【云原生】Kubernetes网络知识

Kubernetes网络管理 文章目录 Kubernetes网络管理一、案例概述二、案例前置知识点2.1、Kubernetes网络模型2.2、Docker网络基础2.3、Kubernetes网络通信2.3.1、Pod内容器与内容之间的通信2.3.2、Pod与Pod之间的通信 2.4、Flannel网络插件2.5、Calico网络插件2.5.1、Calico网络模…