都说B站难爬?这也不难啊!

本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流。好了多了就不多说了喜欢的朋有可以收藏,转发请复原文链接谢谢。

 

一、环境准备

我这里使用的是环境如下仅供参考: 开发工具: pycharm python环境:python-3.8.0 依赖的包: shutil,os,re,json,choice,requests,lxml

二、页面分析

我在这里就拿前段时间非常火的马老师的视频来举例子吧。 视频链接: https://www.bilibili.com/video/BV1Ef4y1i78b?from=search&seid=12072538764197074893

  1. 视频链接解析 我们这里只需要 BV1Ef4y1i78b 也就是 video后面? 号前面

  2. 第二部分抓包,哔哩哔哩这里的视频被分成多个小段了经过看源码分析后我们可以解析</script><script>中的内容返回一个json串解析获取我们想要的数据即可。.

 

  1. 分析返回json中的具体内容

返回给我们的们如下,真正对我们有用的信息在data中

在data 下面我们就可以清晰的看到我们想要的内容了,如视频的画质,以及视频的地址等,注意:如果你拿到地址直接进行访问的话是访问不到了,哔哩哔哩中添加了Referer如果你直接在浏览器访问是没有Referer的是找不到页面的。 我们需要解析的内容如下:

PS:如有需要Python学习资料,此文源码 小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

  1. 视频的时长

  2. 视频的质量

  3. 视频的URL

  4. 音频的URL

  5. 音频和视频合并

 

三、代码实操

3.1 准备工作

依赖的包

import json
import os
import re
import shutil
import ssl
import time
import requests
from concurrent.futures import ThreadPoolExecutor
from random import choice
from lxml import etree

添加请求头和随机用户代理

#设置请求头等参数,防止被反爬
headers = {
   'Accept': '*/*',
   'Accept-Language': 'en-US,en;q=0.5',
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
def get_user_agent():
   '''获取随机用户代理'''
   user_agents = [
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
       "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
       "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
       "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
       "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
       "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
       "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
       "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
       "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
       "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
       "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
       "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
       "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
       "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
       "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
       "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
       "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
       "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
       "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
       "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
       "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
       "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
       "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36",
       "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20",
       "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
       "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
   ]
   # 在user_agent列表中随机产生一个代理,作为模拟的浏览器
   user_agent = choice(user_agents)
   return user_agent

3.2 编写下载代码

def single_download(aid, acc_quality):
    '''单个视频实现下载'''
    # 请求视频链接,获取信息
    origin_video_url = 'https://www.bilibili.com/video/' + aid
    res = requests.get(origin_video_url, headers=headers)
    html = etree.HTML(res.text)
    title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
    print('您当前正在下载:', title)

    video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
    video_info = {}
    # 获取视频质量
    quality = video_info_temp['data']['accept_description'][acc_quality]
    # 获取视频时长
    video_info['duration'] = video_info_temp['data']['dash']['duration']
    # 获取视频链接
    video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
    # 获取音频链接
    audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
    # 计算视频时长
    video_time = int(video_info.get('duration', 0))
    video_minute = video_time // 60
    video_second = video_time % 60
    print('当前视频清晰度为{},时长{}分{}秒'.format(quality, video_minute, video_second))
    # 调用函数下载保存视频
    download_video_single(origin_video_url, video_url, audio_url, title)

3.3 编写下载代码

def download_video_single(referer_url, video_url, audio_url, video_name):
    '''单个视频下载'''
    # 更新请求头
    headers.update({"Referer": referer_url})
    print("视频下载开始:%s" % video_name)
    # 下载并保存视频
    video_content = requests.get(video_url, headers=headers)
    print('%s\t视频大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')

    received_video = 0
    with open('%s_video.mp4' % video_name, 'ab') as output:
        headers['Range'] = 'bytes=' + str(received_video) + '-'
        response = requests.get(video_url, headers=headers)
        output.write(response.content)
    # 下载并保存音频
    audio_content = requests.get(audio_url, headers=headers)
    print('%s\t音频大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
    received_audio = 0
    with open('%s_audio.mp4' % video_name, 'ab') as output:
        headers['Range'] = 'bytes=' + str(received_audio) + '-'
        response = requests.get(audio_url, headers=headers)
        output.write(response.content)
        received_audio += len(response.content)
    print("视频下载结束:%s" % video_name)
    video_audio_merge_single(video_name)

3.4 将下载好的音频和视频合并

def video_audio_merge_single(video_name):
    '''使用ffmpeg单个视频音频合并'''
    print("视频合成开始:%s" % video_name)
    import subprocess
    command = 'ffmpeg -i %s_video.mp4 -i %s_audio.mp4 -c copy %s.mp4 -y -loglevel quiet' % (
        video_name, video_name, video_name)
    subprocess.Popen(command, shell=True)
    print("视频合成结束:%s" % video_name)

3.4 运行测试

 

 

4.总结

好了到这里我们就成功爬取出哔哩哔哩中的视频了!

原文地址:Python爬取哔哩哔哩(bilibili)视频_大数据记录-优快云博客

 

<think>好的,用户之前问过如何使用提供的虫代码进行爬取,我回复了一个详细的使用指南。现在用户反馈不太理解,作为初学者需要更详细的讲解。我需要先回顾之前的回答,可能有些步骤对新手来不够基础。 用户现在明确表示自己是小白,所以需要从最基础的地方开始,比如安装Python、配置环境,甚至如何运行脚本。之前的指南可能跳过了这些步骤,直接进入代码修改和配置,这对新手来可能太了。 接下来,我需要将整个流程拆解得更细致,每一步都详细明。例如,安装依赖库时,可能需要解释每个库的作用,以及如何在命令行中执行pip命令。用户可能不知道如何打开终端或者命令提示符,所以需要指导他们如何操作。 另外,用户可能对代码修改部分感到困惑,尤其是替换base_url和save_dir这些参数。需要具体举例明,比如用实际的网例子,并解释路径的设置。同时,要提醒用户注意网的反机制,合法合规的问题,避免他们不小心触犯法律。 在运行脚本部分,可能需要详细明如何保存文件,运行命令,并预期可能出现的错误。比如,如果用户直接复制代码,可能会遇到缩进错误或者缺少库的问题,这时候需要给出解决方案,比如如何安装缺失的库,或者检查代码格式。 此外,用户可能对高级配置部分感到害怕,比如代理设置和请求头修改。作为小白,他们可能不需要立即接触这些内容,所以可能需要简化这部分,或者建议他们在基础使用成功后再尝试。 最后,需要强调注意事项,比如法律问题,尊重网的robots.txt,以及下载速度的控制,避免对目标网造成过大压力。同时,提供常见问题的解决方法,比如处理SSL错误或文件名乱码,这些是新手可能会遇到的问题。 总结来,我需要把之前的指南转化为更口语化、分步骤的教程,避免专业术语,多用比喻和实际例子,确保用户能一步步跟着操作,并在每个步骤中预见到可能的问题和解决办法。同时,要给予鼓励,让他们在遇到问题时不要气馁,逐步学习和调试。</think>好的!我会用最详细易懂的方式,从零开始教你如何用Python进行图片爬取。以下是 **完全面向新手的保姆级教程**: --- ### **一、准备工作(5分钟)** #### 1. 安装Python 访问[Python官网](https://www.python.org/downloads/)下载安装包,安装时务必勾选 **"Add Python to PATH"** ![Python安装截图](https://example.com/python-install.png) *(如果找不到选项,请参考B教程:Python安装教程)* #### 2. 安装必备工具 按 `Win + R` 打开运行窗口 → 输入 `cmd` → 回车 → 输入以下命令: ```bash pip install requests beautifulsoup4 tqdm lxml ``` ![cmd安装截图](https://example.com/cmd-install.png) --- ### **二、创建虫文件(3分钟)** 1. 在桌面新建文件夹 `my_spider` 2. 右键文件夹空白处 → 新建 → 文本文档 → 重命名为 `image_crawler.py` 3. 右键用 **记事本** 打开文件,粘贴以下代码: ```python import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from tqdm import tqdm class SimpleImageCrawler: def __init__(self, base_url, save_dir='images'): self.base_url = base_url self.save_dir = save_dir self.session = requests.Session() os.makedirs(save_dir, exist_ok=True) def download_image(self, url): try: response = self.session.get(url, timeout=10) filename = os.path.join(self.save_dir, url.split('/')[-1]) with open(filename, 'wb') as f: f.write(response.content) return True except: return False def crawl(self): response = self.session.get(self.base_url) soup = BeautifulSoup(response.text, 'lxml') # 查找所有<img>标签 img_tags = soup.find_all('img') image_urls = [urljoin(self.base_url, img['src']) for img in img_tags] # 下载图片 success_count = 0 for url in image_urls: if self.download_image(url): success_count += 1 print(f'下载完成!成功保存 {success_count}/{len(image_urls)} 张图片') if __name__ == "__main__": # 🎯修改这里!设置你要的网页 crawler = SimpleImageCrawler( base_url='https://httpbin.org/image', # 测试网 save_dir='my_images' # 图片保存位置 ) crawler.crawl() ``` --- ### **三、第一次运行(2分钟)** 1. 双击打开 `image_crawler.py` → 按 `Ctrl + S` 保存 2. 在文件夹地址栏输入 `cmd` → 回车打开命令行 3. 输入命令运行: ```bash python image_crawler.py ``` 你会看到: ``` 下载完成!成功保存 3/3 张图片 ``` 此时打开 `my_images` 文件夹就能看到下载的图片! --- ### **四、爬取自己的网(关键步骤)** #### 1. 修改目标网 用记事本打开代码,找到这行: ```python base_url='https://httpbin.org/image' # ← 改成你的目标网址 ``` 例如改成: ```python base_url='https://picsum.photos/' # 免费图片网 ``` #### 2. 调整图片选择规则 如果发现下载的不是想要的图片,修改这部分代码: ```python img_tags = soup.find_all('img') # ← 可能需要调整 ``` 比如网图片在 `<div class="photo">` 里: ```python divs = soup.find_all('div', class_='photo') image_urls = [urljoin(self.base_url, div.find('img')['src']) for div in divs] ``` --- ### **五、常见问题解决** #### ❌ 报错 `ModuleNotFoundError` 明缺少库,回到 **步骤一.2** 重新安装 #### ❌ 下载了0张图片 检查: 1. 网络是否正常 2. 网页是否需要登录 3. 图片是否通过JavaScript加载(需用Selenium) #### 💡 高级技巧(可选) - 添加延迟:在 `download_image` 方法开头加 `time.sleep(1)` - 过滤图片类型:只下载jpg文件 ```python if not url.endswith('.jpg'): continue ``` --- ### **六、法律提示⚠️** 1. 不要爬取敏感数据 2. 查看目标网的 `robots.txt`(在网址后加 `/robots.txt`) 3. 商业用途需获得授权 现在你已经掌握了基础虫技能!建议先用测试网练习,成功后再尝试真实网。如果遇到问题,随时可以问我具体哪一步不懂哦~ 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值