分析Ajax爬取B站python视频

本文介绍了如何通过分析Ajax的方法,解决B站视频爬虫未能获取视频图片信息的问题。详细解释了如何使用requests库进行网络请求,解析返回的JSON数据,并提取所需信息如图片地址、视频地址、作者、标题、播放量和上传时间。同时,提供了时间戳转换为标准格式的时间的方法。最后,通过代码实战展示了整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B 站真是个神奇的网站。找不到资料了,去 B 站逛一逛,保准有你满意的东西。

前几天写了个爬虫,用 path、re、BeautifulSoup 爬取的 B 站 python 视频,但是这个爬虫有有个缺陷,没能获取视频的图片信息,如果你去尝试你会发现它根本就不在返回的结果里面。今天就用分析 Ajax 的方法获取到。

分析页面

通常我们在分析页面的时候,都要切换到 Network 分析url 从中找到我们想要的 url 。但是找不到 url 你怎么分析?B 站就是这么神奇的存在,我们最后分析确定的 url 是这个:

url = 'https://api.bilibili.com/x/web-interface/search/type?jsonp=jsonp&&search_type=video&highlight=1&keyword=python&page={}'.format(page)

打开 B 站,搜索 python ,打开开发者工具,切换到 Network 你可以去找找,还真是没有。
至于怎么找到的呢,我也是摸索了好长时间才发现

图片

图片


点一下搜索,这个 url 才会出现,或者点一下下一页
详情

详情


然后就构造这个请求就可以了。
需要注意的是最后一个参数不能添加。

 

代码实战

import requests
import json,re,time
import pandas as pd
from requests.exceptions import RequestException

class Spider():

    def get_page(self,page):
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
                              ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
            }
            url = 'https://api.bilibili.com/x/web-interface/search/type?jsonp=jsonp&&search_type=video&highlight=1&keyword=python&page={}'.format(page)
            r = requests.get(url,headers)
            if r.status_code == 200:
                return r.text
            else:
                print(r.status_code)
        except RequestException:
            print('请求失败')
            return None

    def parse_page(self,html):
        #转换成JSON对象,好操作
        data = json.loads(html)

        results = data.get('data').get('result')
        for result in results:
            #获取图片地址
            image_url = result['pic']
            #获取视频地址
            video_url = result['arcurl']
            #获取作者
            video_author = result['author']
            #获取视频标题,中间有额外的字符,用re替换一下
            video_title = result['title']
            video_title = re.sub('<em class="keyword">[Pp]ython</em>','Python',video_title)
            #获取播放量
            video_play = result['play']
            #获取上传时间,这里将时间戳转换成标准格式
            video_date = result['pubdate']
            timestr = time.localtime(video_date)
            video_date = time.strftime('%Y-%m-%d %H-%M-%S',timestr)
            print(image_url,video_url,video_title,video_play,video_date)

    def run(self):
        for i in range(1,3):
            html = self.get_page(i)
            self.parse_page(html)

def main():
    spider = Spider()
    spider.run()

if __name__ == '__main__':
    main()

代码里面有些解释已经很清楚了,在这里再次复习一下

re.sub()

这个函数传入五个参数,前三个是必须传入的 pattern,、repl、 string

  • 第一个是表示的是正则表达式中模式字符串
  • 第二个是要被替换的字符串
  • 第三个是文本字符串
    剩下两个可选参数,一个是 count 一个是 flag 。

时间戳转换成标准格式的时间
第一种方法

import time
timeStamp = 1581418600
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
print otherStyleTime

第二种方法

import time
import datetime
timeStamp = 1381419600
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
otherStyleTime = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print otherStyleTime

综上就是这次的全部内容,多加练习继续加油!

<think>好的,用户想用Python爬虫抓取B的充电视频内容或信息。首先,我需要理解什么是充电视频。充电视频应该是B用户通过“充电计划”支持的视频,这些可能需要特殊权限或者特定的接口才能访问。用户之前的问题里提到了爬取B视频信息,但充电视频可能结构不同或者需要处理登录和权限。首先,我需要考虑B的页面结构是否有充电视频的专门页面或者API。可能需要模拟登录,因为充电视频可能只有登录后的用户可见,尤其是支持过的UP主的视频。用户之前的示例代码用了requests和BeautifulSoup,但充电视频可能需要处理更复杂的验证,比如cookies或者headers。然后,查看用户提供的引用,引用1中的代码是爬取首页视频信息,通过查找div和picture标签。但充电视频可能不在首页,需要找到对应的URL。可能需要先登录,获取用户的cookies,然后访问充电视频的页面。或者,B是否有专门的API接口返回充电视频的数据?比如通过Ajax加载的JSON数据。 另外,B的反爬机制比较严格,可能需要设置合适的请求头,比如User-Agent,Referer,以及处理可能的加密参数。比如,视频链接可能需要带有特定的参数才能访问,或者需要解析JavaScript生成的内容,这时候可能需要用Selenium之类的工具,但用户之前的例子用的是requests和BeautifulSoup,所以尽量保持同样的方法。接下来,步骤可能是:1.登录B获取cookies;2.找到充电视频的页面URL或API;3.发送请求获取数据;4.解析数据,提取所需信息。但登录部分可能需要处理验证码,或者使用已保存的cookies。如果用户只是想公开的充电视频,可能不需要登录,但不确定。 另外,充电视频的页面结构可能和普通视频不同,需要分析HTML结构。或者,通过B的搜索接口,添加充电相关的过滤参数。比如,在搜索时添加充电相关的参数,但需要查看B的API文档或者通过浏览器开发者工具抓包分析。 用户提供的引用2中有下载视频的代码,使用了一个get_video函数,可能需要用到requests的流式下载。但下载视频需要注意版权问题,以及B是否有反爬措施,比如检测频繁请求。 总结步骤:模拟登录获取权限→定位充电视频的页面或接口→发送请求获取数据→解析HTML或JSON→提取信息→存储或下载。其中,登录和定位充电视频的入口是关键点。可能需要使用session保持登录状态,携带cookies发送请求。 需要验证充电视频的URL结构。比如,是否在某个特定路径下,或者需要通过用户主页的充电记录查找。或者,B的API接口是否有充电视频的列表,比如https://api.bilibili.com/x/ugcpay-rank/v1/elec/month/list?这可能涉及到API的参数,如mid(用户ID)等。此外,用户可能需要提取的信息包括视频标题、链接、UP主、充电人数、金额等。解析这些信息需要找到对应的HTML标签或JSON字段。最后,需要注意法律和道德问题,确保爬虫行为符合B的使用条款,不侵犯隐私和版权。</think>以下是使用Python爬虫获取B充电视频数据的解决方案: ### 一、技术实现步骤 1. **登录认证** - 需使用B登录态Cookie中的`SESSDATA`和`bili_jct`参数 - 通过`requests.Session()`维持会话 ```python session = requests.Session() cookies = { 'SESSDATA': '你的SESSDATA值', 'bili_jct': '你的bili_jct值' } ``` 2. **定位充电接口** - 充电视频接口为:`https://member.bilibili.com/x/web/archives` - 需要POST请求并携带参数: ```python params = { 'type': 'elec', # 标识充电视频 'pn': 1, # 页码 'ps': 20 # 每页数量 } ``` 3. **解析数据** - 返回数据为JSON格式,包含视频标题、BV号、充电人数等信息 ```python response = session.post('https://member.bilibili.com/x/web/archives', params=params, cookies=cookies) data = response.json()['data']['archives'] ``` 4. **补充视频详情** - 通过`https://api.bilibili.com/x/web-interface/view`接口获取单个视频详细信息 ```python video_api = 'https://api.bilibili.com/x/web-interface/view' video_params = {'bvid': bvid} ``` ### 二、完整示例代码 ```python import requests from bs4 import BeautifulSoup def get_elec_videos(): session = requests.Session() cookies = { 'SESSDATA': 'YOUR_SESSDATA', 'bili_jct': 'YOUR_BILI_JCT' } # 获取充电视频列表 list_url = 'https://member.bilibili.com/x/web/archives' params = {'type': 'elec', 'pn': 1, 'ps': 20} resp = session.post(list_url, params=params, cookies=cookies) if resp.status_code == 200: videos = resp.json()['data']['archives'] for video in videos: print(f"标题:{video['title']}") print(f"BV号:{video['bvid']}") print(f"充电人数:{video['elec_info']['count']}") # 获取视频详情 detail_url = 'https://api.bilibili.com/x/web-interface/view' detail_resp = session.get(detail_url, params={'bvid': video['bvid']}) if detail_resp.status_code == 200: stat = detail_resp.json()['data']['stat'] print(f"播放量:{stat['view']}") print(f"弹幕量:{stat['danmaku']}\n") get_elec_videos() ``` ### 三、注意事项 1. **反爬机制** - 需要设置合理的请求间隔(建议≥3秒) - 建议携带完整请求头(包含`Referer`、`Origin`等参数) ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...', 'Referer': 'https://www.bilibili.com/' } ``` 2. **数据存储** - 建议将数据存储为结构化格式(CSV/JSON) ```python import csv with open('elec_videos.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['标题', 'BV号', '充电人数', '播放量']) ``` 3. **法律边界** - 仅爬取公开可访问数据 - 遵守robots.txt协议(B禁止爬虫访问部分路径)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值