文章目录
一、写在前面的话(必看!!!)
最近发现很多小伙伴对视频数据采集感兴趣(特别是学习类素材),但总卡在反爬机制上。今天就拿B站举个栗子,手把手教你如何用代理IP突破限制!(仅限技术交流,请遵守相关法律法规)
二、环境准备(保姆级清单)
2.1 基础装备
- Python 3.8+(推荐用Anaconda全家桶)
- requests库(网络请求必备)
- beautifulsoup4(HTML解析神器)
- fake_useragent(伪装浏览器头)
安装命令直接甩给你:
pip install requests beautifulsoup4 fake_useragent
2.2 代理IP配置(核心!!!)
这里建议用付费代理服务(免费的基本都凉了),我测试过几个稳定的:
- 每天有10个免费测试IP的平台(自己搜)
- 动态住宅代理(成功率最高)
- 数据中心代理(速度最快)
举个配置示例:
proxies = {
'http': 'http://username:password@ip:port',
'https': 'http://username:password@ip:port'
}
三、实战七步走(跟着做就完事了)
3.1 伪装请求头(防封第一步)
from fake_useragent import UserAgent
headers = {
'User-Agent': UserAgent().random,
'Referer': 'https://www.bilibili.com/'
}
3.2 获取视频页面(关键步骤)
用开发者工具分析页面结构时发现:
- 视频数据藏在
window.__playinfo__
里 - 真实地址需要解析
durl
数组 - 清晰度参数是
qn=80
这种格式
3.3 代理IP接入(核心代码)
import requests
def get_video_url(bvid):
try:
response = requests.get(
f'https://api.bilibili.com/x/player/playurl?bvid={bvid}',
headers=headers,
proxies=proxies, # 这里接入代理
timeout=10
)
return response.json()['data']['durl'][0]['url']
except Exception as e:
print(f'获取失败:{str(e)}')
return None
3.4 分片下载策略(大文件必备)
实测超过100M的视频必须分块下载:
def download_video(url, filename):
with requests.get(url, stream=True, proxies=proxies) as r:
with open(filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024*1024):
if chunk:
f.write(chunk)
3.5 自动重试机制(防掉线)
retry_count = 0
while retry_count < 3:
try:
# 执行下载操作
break
except:
retry_count += 1
print(f'第{retry_count}次重试...')
四、那些年我踩过的坑(血泪经验)
4.1 403错误大全
- 症状:突然返回403 Forbidden
- 解决方案:
- 立即更换User-Agent
- 切换代理IP类型(住宅→机房)
- 降低请求频率(加随机延时)
4.2 视频碎片化问题
有的视频会分割成多个片段,需要合并:
# 用ffmpeg合并(需要提前安装)
import os
os.system('ffmpeg -f concat -i filelist.txt -c copy output.mp4')
五、法律红线千万别碰(重要!!!)
- 绝对不要绕过付费内容(会进去的!)
- 控制下载频率(建议<5次/分钟)
- 仔细阅读robots.txt协议
- 个人学习使用,禁止商业用途
六、完整源码示例(拿走不谢)
(因篇幅限制展示核心部分,完整代码请私信)
class BiliDownloader:
def __init__(self, proxy_pool):
self.proxies = self._load_proxies(proxy_pool)
self.current_proxy = None
def _rotate_proxy(self):
self.current_proxy = random.choice(self.proxies)
def download_batch(self, bvid_list):
for bvid in bvid_list:
self._rotate_proxy()
video_url = self._get_real_url(bvid)
if video_url:
self._download(video_url, f'{bvid}.mp4')
七、技术问答环节(常见问题)
Q:为什么我用了代理还是被封?
A:检查这三个点:
- 代理IP是否高匿
- 请求头是否带cookie
- 是否有异常鼠标轨迹
Q:下载的视频没声音怎么办?
A:需要单独下载音频流,用ffmpeg合成:
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4
八、最后说两句
爬虫本质是效率工具,千万别用来干坏事!最近帮朋友用这个方法采集健身视频做分析模型,效率提升了10倍不止。但切记要控制好请求频率,我之前因为没设延时,把公司IP都给搞封了…(血的教训)
下次准备写《动态渲染页面破解指南》,想看的同学评论区扣1!如果有其他想了解的技术点也欢迎留言~