B站视频链接抓取避坑指南:从API分析到数据存储的全流程解析

深入探讨BiliBili API:获取视频内容的智能方法 通过本文,你应该对如何使用BiliBili API有了更好的理解。BiliBili API官方文档Python库文档。 阅读详情

B站视频链接抓取避坑指南:从API分析到数据存储的全流程解析

最近在做一个内容分析项目,需要批量获取B站上特定主题的视频信息。本以为用Python写个爬虫脚本是件轻松活儿,没想到实际操作起来,从请求构造到数据存储,每一步都藏着不少“坑”。如果你也正打算从B站获取视频数据,并且已经对Python和HTTP请求有了基本了解,那么这篇文章或许能帮你省下不少调试和排查的时间。我们不会停留在简单的代码复制粘贴,而是会深入分析B站API的响应结构,探讨如何优雅地处理反爬机制,并设计一个健壮、高效的数据存储流程。整个过程,更像是一次技术探险,我们一起来拆解那些看似简单实则暗藏玄机的细节。

1. 理解B站搜索API:不止是URL那么简单

很多人拿到一个API链接就开始写循环请求,但往往忽略了理解这个接口到底返回了什么,以及它的限制在哪里。B站的搜索API看似直接,但其返回的JSON结构嵌套较深,且不同接口版本可能存在差异。

首先,我们得搞清楚从哪里找到可用的API。B站的前端页面通过XHR请求加载数据,我们可以通过浏览器的开发者工具(F12打开,切换到Network标签,筛选XHR)来捕捉这些请求。当你进行搜索时,会发现一个包含search/type关键词的请求,这就是我们要找的搜索接口。但直接使用抓包到的URL可能不够灵活,我们需要分析其查询参数(Query Parameters)。

一个典型的搜索API URL可能包含如下关键参数:

  • keyword: 搜索关键词,需要URL编码。
  • page: 页码,从1开始。
  • page_size: 每页返回的视频数量,通常有上限(比如42)。
  • search_type: 搜索类型,如video表示视频。
  • 其他参数如platform、highlight等,可能影响返回结果的格式或排序。

重点在于,B站的API并非完全公开的官方文档,其稳定性无法保证。这意味着今天能用的接口,明天可能就变了参数名或者返回结构。因此,我们的代码需要具备一定的容错性和适应性,不能把所有的逻辑都硬编码死。

来看一个实际的响应数据片段解析。假设我们请求的是视频搜索,返回的JSON中,我们最关心的数据通常藏在 data -> result 路径下。每一个视频项(card)本身又是一个包含大量信息的对象。

{
  "code": 0,
  "data": {
    "result": [
      {
        "type": "video",
        "id": 1234567890,
        "arcurl": "https://www.bilibili.com/video/BV1xx411x7xx",
        "title": "这是一个视频标题",
        "duration": "15:30",
        "pubdate": 1640995200,
        // ... 其他许多字段,如作者、播放量、弹幕数等
      }
    ],
    // ... 分页信息等
  }
}

注意:arcurl 字段是视频的详情页链接,而id(有时是aid或bvid)是视频的唯一标识。在后续处理中,根据你的需求选择存储哪个。如果需要进行更深入的元数据获取(如视频简介、标签),你可能需要根据这个arcurl或bvid再发起一次请求。

仅仅解析出链接和标题还不够。一个健壮的爬虫应该能处理API可能返回的各种异常情况。例如,code字段不为0表示请求失败或没有结果;result字段可能为空列表;甚至整个JSON的结构都可能因为接口更新而发生变化。因此,在解析数据之前,先进行状态检查是必不可少的步骤。

2. 构建稳健的请求层:与反爬机制共舞

直接使用requests.get()发送请求,大概率会在几分钟内收到429(请求过多)状态码,或者更直接地,IP被暂时限制访问。B站的反爬策略虽然不算最严苛,但对于高频、规律的请求非常敏感。构建稳健的请求层,核心思路是“模拟真人,分散请求”。

首先,请求头(Headers)是敲门砖。 只设置一个随机的User-Agent是远远不够的。现代网站会检查一系列头部信息来判断请求是否来自真实的浏览器。以下是一个建议的、更完整的请求头字典,你可以根据需要调整:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://search.bilibili.com/',  # 模拟从搜索页跳转而来
    'Origin': 'https://www.bilibili.com',
    'Connection': 'keep-alive',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
}

使用fake_useragent库动态生成User-Agent是个好习惯,但要注意其更新频率。有时,一个看起来“太新”或“太旧”的UA也可能被标记。我的经验是,准备一个包含几十个常见UA的列表,轮流使用,比完全随机生成更稳定。

其次,请求频率控制是生存法则。 time.sleep(random.uniform(1, 3)) 是基础操作,但我们可以做得更智能。一个更好的模式是“随机延迟 + 请求间隔日志 + 异常退避”。

import time
import random

def request_with_backoff(url, headers, max_retries=3):
    retries = 0
    while retries < max_retries:
        try:
            # 在每次重试前也增加一点延迟
            if retries > 0:
                time.sleep(2 ** retries)  # 指数退避
            response = requests.get(url, headers=headers, timeout=10)
            response.raise_for_status()  # 检查HTTP状态码是否为200
            return response
        except requests.exceptions.RequestException as e:
            print(f"请求失败 ({retries+1}/{max_retries}): {e}")
            retries += 1
        # 正常请求后的随机延迟
        time.sleep(random.uniform(2, 5))  # 间隔设置在2-5秒比较安全
    print(f"重试{max_retries}次后仍失败: {url}")
    return None

此外,考虑使用IP代理池是应对IP封锁的终极方案,但对于个人或小规模爬取,通过控制频率和模拟浏览器行为通常已足够。如果你发现即使设置了延迟和完整头部仍频繁被阻,可以尝试在请求中加入cookies(通过Selenium等工具先获取一次有效的登录cookie)。

提示:务必尊重网站的robots.txt规则。虽然技术上有能力抓取,但过度频繁的请求会对对方服务器造成压力,也可能违反服务条款。将你的爬虫用于个人学习、数据分析,并严格控制请求量,是负责任的做法。

3. 数据解析与清洗:从原始JSON到结构化信息

拿到API的JSON响应后,我们面临两个任务:一是准确提取出目标字段,二是对数据进行初步清洗,使其适合存储和分析。原始数据往往包含我们不需要的字段,或者格式不统一(比如时长可能是“15:30”字符串,也可能是秒数)。

假设我们已经通过上一节的稳健请求获取到了response对象,并确认状态码为200。第一步是解析JSON并检查整体结构。

import json

def parse_search_response(response):
    try:
        data = response.json()
    except json.JSONDecodeError:
        print("响应不是有效的JSON格式")
        return []
    
    # 检查API返回码,B站通常0表示成功
    if data.get('code') != 0:
        print(f"API返回错误码: {data.get('code')}, 消息: {data.get('message')}")
        return []
    
    # 安全地获取结果列表
    result_list = data.get('data', {}).get('result', [])
    if not isinstance(result_list, list):
        print("结果格式异常,不是列表")
        return []
    
    parsed_videos = []
    for item in result_list:
        # 确保item是字典且包含必要字段
        if not isinstance(item, dict):
            continue
            
        video_info = {
            'bvid': item.get('bvid'),  # 新的BV号
            'aid': item.get('id'),      # 旧的AV号
            'title': item.get('title', '').strip(),
            'arcurl': item.get('arcurl', ''),  # 视频页面链接
            'duration': item.get('duration', 0),  # 可能是秒数
            'pubdate': item.get('pubdate', 0),    # 时间戳
            'owner': item.get('author', ''),      # UP主名
            'view': item.get('play', 0),          # 播放量
            'danmaku': item.get('video_review', 0), # 弹幕数
        }
        # 对duration进行格式化:如果它是“mm:ss”字符串,转换为秒数
        if isinstance(video_info['duration'], str) and ':' in video_info['duration']:
            parts = video_info['duration'].split(':')
            if len(parts) == 2:
                try:
                    video_info['duration_sec'] = int(parts[0]) * 60 + int(parts[1])
                except ValueError:
                    video_info['duration_sec'] = 0
            else:
                video_info['duration_sec'] = 0
        else:
            # 如果已经是数字,直接使用
            video_info['duration_sec'] = int(video_info['duration'])
        
        parsed_videos.append(video_info)
    
    return parsed_videos

这个解析函数做了几件重要的事:

  1. 异常处理:捕获JSON解析错误,防止无效响应导致程序崩溃。
  2. 状态检查:验证API的code字段,处理请求失败的情况。
  3. 安全访问:使用.get()方法获取字典值,避免键不存在时抛出KeyError。
  4. 数据清洗:对title去除首尾空格,将字符串格式的duration统一转换为秒数,便于后续的数值分析。
  5. 字段映射:注意B站API中,播放量字段可能是play,弹幕数可能是video_review,不同接口可能有不同命名,需要根据实际响应调整。

清洗后的数据已经变成了一个结构清晰的字典列表,每个字典代表一个视频的标准化信息。这为下一步的存储和入库做好了准备。

4. 高效存储策略:CSV、数据库与增量更新

数据抓取下来后,如何存储是一个关键决策。CSV文件简单易用,适合小规模数据和快速验证。但对于大规模、长期的项目,或者需要复杂查询的情况,数据库是更优的选择。我们分别讨论这两种方案。

方案一:使用CSV文件存储 CSV的优势是无需额外环境,用Excel或文本编辑器就能查看。Python的csv模块也非常易用。但要注意几个细节:

  • 编码问题:务必使用utf-8-sig编码,这样在Excel中打开时不会出现乱码。utf-8-sig会在文件开头写入BOM(字节顺序标记),帮助Excel正确识别编码。
  • 追加模式:使用'a'模式打开文件以追加数据,但要注意,如果程序中断后重新运行,可能会写入重复的表头。一个常见的做法是,在首次写入时写表头,后续追加时只写数据。
  • 文件锁:在多线程/进程爬虫中,同时写入一个CSV文件会导致数据错乱。需要引入锁机制,或者让每个线程写入独立的文件,最后再合并。

下面是一个改进的CSV写入函数,它解决了表头重复和线程安全(通过检查文件是否存在)的问题:

import csv
import os
from threading import Lock

csv_lock = Lock()  # 用于多线程环境

def save_to_csv(video_list, filename='bilibili_videos.csv'):
    if not video_list:
        return
    
    # 定义CSV的列名(字段顺序)
    fieldnames = ['bvid', 'aid', 'title', 'arcurl', 'duration_sec', 'pubdate', 'owner', 'view', 'danmaku']
    
    file_exists = os.path.isfile(filename)
    
    with csv_lock:  # 如果是单线程,可以去掉这行
        with open(filename, 'a', newline='', encoding='utf-8-sig') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            
            # 如果文件不存在(首次运行)或为空,写入表头
            if not file_exists or csvfile.tell() == 0:
                writer.writeheader()
            
            for video in video_list:
                writer.writerow(video)
    print(f"已写入 {len(video_list)} 条记录到 {filename}")

方案二:使用SQLite数据库存储 当数据量达到几千条以上,或者你需要进行复杂查询(如“查找播放量大于10万且时长小于5分钟的视频”)时,SQLite是一个轻量级且强大的选择。它无需安装独立的数据库服务器,单个文件即可管理。

使用SQLite存储,我们可以更好地结构化数据,并利用SQL的查询能力。首先,我们需要创建一张表来存储视频信息。

import sqlite3

def init_sqlite_db(db_path='bilibili_data.db'):
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    create_table_sql = '''
    CREATE TABLE IF NOT EXISTS videos (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        bvid TEXT UNIQUE,  -- 设置唯一约束,避免重复插入
        aid INTEGER,
        title TEXT NOT NULL,
        arcurl TEXT NOT NULL,
        duration_sec INTEGER,
        pubdate INTEGER,
        owner TEXT,
        view INTEGER,
        danmaku INTEGER,
        created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    '''
    cursor.execute(create_table_sql)
    
    # 可以为常用查询字段创建索引,加快搜索速度
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_bvid ON videos (bvid);')
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_pubdate ON videos (pubdate);')
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_view ON videos (view);')
    
    conn.commit()
    conn.close()
    print(f"数据库初始化完成: {db_path}")

def save_to_sqlite(video_list, db_path='bilibili_data.db'):
    if not video_list:
        return
    
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    insert_sql = '''
    INSERT OR IGNORE INTO videos 
    (bvid, aid, title, arcurl, duration_sec, pubdate, owner, view, danmaku)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    '''
    
    data_to_insert = []
    for video in video_list:
        # 准备插入的数据元组,顺序必须与SQL语句中的列顺序一致
        data_tuple = (
            video.get('bvid'),
            video.get('aid'),
            video.get('title'),
            video.get('arcurl'),
            video.get('duration_sec'),
            video.get('pubdate'),
            video.get('owner'),
            video.get('view'),
            video.get('danmaku'),
        )
        data_to_insert.append(data_tuple)
    
    try:
        cursor.executemany(insert_sql, data_to_insert)
        conn.commit()
        print(f"成功插入/忽略 {cursor.rowcount} 条记录到数据库。")
    except sqlite3.Error as e:
        print(f"数据库插入错误: {e}")
        conn.rollback()
    finally:
        conn.close()

使用INSERT OR IGNORE语句,配合bvid字段的UNIQUE约束,可以非常方便地实现增量更新。当爬虫再次运行时,只有新的(bvid不重复)视频记录会被插入,已有的记录则被自动忽略,避免了数据重复。created_time字段记录了每条数据首次入库的时间,便于追踪。

选择CSV还是数据库,取决于你的项目阶段和需求。在开发调试初期,CSV的简单直观很有帮助。当项目进入正轨,需要持久化、查询和管理数据时,切换到SQLite几乎是无痛的,并且能带来巨大的长期收益。

5. 实战流程整合与高级技巧

现在,让我们把前面所有模块整合成一个完整、健壮的爬虫工作流。这个工作流将包含配置管理、错误日志记录、进度显示等生产级爬虫应考虑的要素。

首先,我们用一个配置文件或字典来管理爬虫参数,这样调整关键词、页码范围时不需要去代码里四处寻找。

# config.py (或直接写在主脚本中)
CONFIG = {
    'keyword': '编程教学',  # 搜索关键词
    'total_pages': 10,      # 计划爬取的总页数
    'start_page': 1,        # 起始页码
    'base_url': 'https://api.bilibili.com/x/web-interface/search/type',
    'output_csv': 'output/videos.csv',
    'output_db': 'output/bilibili.db',
    'request_timeout': 15,
    'max_retries': 3,
    'delay_range': (2, 5),  # 请求延迟范围(秒)
}

接着,我们构建主循环。它负责协调请求、解析、存储和错误处理。

# main.py
import time
import random
import logging
from urllib.parse import quote

# 配置日志,方便调试和监控
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('crawler.log'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

def build_search_url(page, keyword, base_url):
    """构建搜索API的URL"""
    encoded_keyword = quote(keyword)
    url = f"{base_url}?page={page}&page_size=42&keyword={encoded_keyword}&search_type=video"
    # 这里可以添加其他必要的固定参数
    return url

def main():
    config = CONFIG
    logger.info(f"开始爬取关键词: {config['keyword']}")
    
    # 初始化数据库(如果选择数据库存储)
    init_sqlite_db(config['output_db'])
    
    for page in range(config['start_page'], config['start_page'] + config['total_pages']):
        logger.info(f"正在处理第 {page} 页...")
        
        # 1. 构建URL
        url = build_search_url(page, config['keyword'], config['base_url'])
        
        # 2. 发送请求(使用之前定义的稳健请求函数)
        response = request_with_backoff(
            url, 
            headers=headers,  # 假设headers已定义
            max_retries=config['max_retries']
        )
        
        if response is None:
            logger.error(f"第 {page} 页请求失败,跳过。")
            continue
        
        # 3. 解析响应
        video_list = parse_search_response(response)
        if not video_list:
            logger.warning(f"第 {page} 页解析结果为空。")
            # 可能已到最后一页,可以考虑提前终止循环
            # if page > config['start_page'] + 5:  # 连续多页为空
            #     break
        else:
            logger.info(f"第 {page} 页解析到 {len(video_list)} 个视频。")
            
            # 4. 存储数据(这里以数据库为例)
            save_to_sqlite(video_list, config['output_db'])
            # 如果想同时存CSV备份: save_to_csv(video_list, config['output_csv'])
        
        # 5. 请求间隔延迟
        delay = random.uniform(*config['delay_range'])
        logger.debug(f"等待 {delay:.2f} 秒后继续。")
        time.sleep(delay)
    
    logger.info("爬取任务全部完成。")

if __name__ == '__main__':
    main()

这个主流程已经相当完整,但它还可以在以下几个方面进行增强,以适应更复杂的需求:

  • 断点续爬:将当前成功爬取到的最大页码持久化到文件或数据库。当程序因网络或错误中断后重新启动时,可以从上次的页码继续,而不是从头开始。
  • 分布式爬取:如果需要爬取海量数据(数十万视频),单机单线程太慢。可以考虑使用Scrapy框架,或者用concurrent.futures实现简单的多线程,但务必注意共享资源(如文件、数据库连接)的线程安全,以及总的请求频率不要超标。
  • 数据去重与更新:我们通过bvid唯一约束实现了插入时的去重。但如果想更新已有视频的播放量、弹幕数等动态信息,就需要更复杂的逻辑,比如使用INSERT OR REPLACE,或者先查询再判断是否需要更新。
  • 遵守Robots协议:虽然技术上行得通,但最好检查一下目标网站的robots.txt(例如https://www.bilibili.com/robots.txt),了解哪些路径是允许爬取的,并设置合理的爬取延迟,体现技术人的操守。

最后,分享一个我踩过的坑:有一次爬取时,我设置的延迟是1到3秒,但爬了几百条后还是被限制了。后来发现,问题出在我的IP是数据中心IP(云服务器),这类IP的请求本身就更受监控。解决方案是换用家庭宽带IP,或者将延迟提高到3到8秒,并加入了更随机的“模拟浏览行为”,比如在每10次请求后,随机休眠一个较长的时间(30-60秒),模拟用户停下来浏览页面的行为。这些小技巧往往比单纯提高延迟更有效。

Python爬虫实战:5分钟搞定B站视频链接批量抓取(附完整代码) 本文详细介绍了如何使用Python快速实现B站视频链接的批量抓取,通过调用B站搜索API和简单的爬虫技术,5分钟内即可完成数据采集。文章包含完整代码示例,适合开发者、数据分析师和技术爱好者学习使用,帮助提升数据收集效率。 阅读详情

相关推荐

【Python爬虫实战】爬取B站视频信息

本文详细介绍了如何使用Python爬虫技术从B站获取视频信息。我们从分析反爬机制开始,逐步构建了一个高效的爬虫,涵盖了请求模拟、页面解析、数据提取和存储等步骤。通过爬虫,我们能够快速获取大量B站视频数据,为后续的分析和应用提供基础。未来,我们可以将这些数据用于多种分析任务,如热门视频趋势分析、用户行为研究等。随着爬虫技术的发展,我们还可以进一步优化爬虫性能,提升爬取效率。

2201_76125261的博客 1686

深入解析:使用Python爬取Bilibili视频的完整指南

通过本文,我们详细介绍了如何使用Python进行Bilibili视频信息的爬取工作,包括环境配置、API调用和数据存储等步骤。尽量遵循合法合规的爬取方式,以便更好地进行数据分析和创新应用。

码上飞扬的博客 2252

Python 爬虫实战:爬取 B 站排行榜视频数据

本文详细介绍了使用Python爬取B站排行榜数据的方法。通过分析B站API接口,利用Requests库获取JSON格式数据,并结合jsonpath和Pandas进行数据解析与存储。文章包含完整的代码实现,涵盖视频标题、UP主、播放量等核心字段的提取,并提供了反爬策略与优化建议。该方法适用于内容趋势分析和数据研究,强调需遵守robots协议和合理使用原则。案例展示了从技术实现到合规应用的全流程,为爬虫学习者提供了可操作的参考方案。

2503_91057718的博客 1390

哔哩哔哩-API收集整理:API文档搜索分类与结果过滤功能实现

在日常使用哔哩哔哩(B站)时,你是否曾为找不到想要的视频、番剧或用户而烦恼?是否希望能更精准地筛选搜索结果,快速定位到自己感兴趣的内容?本文将详细介绍B站API中搜索分类与结果过滤功能的实现方法,帮助你轻松掌握如何利用这些功能提升搜索效率。 ## 搜索功能概述 B站搜索功能为用户提供了便捷的内容查找方式,主要包括综合搜索和分类搜索两种类型。综合搜索默认返回与关键词相关的多种类型结果,如视频、番...

gitblog_00762的博客 1389

Python爬虫实战:B站动漫数据分析与可视化全流程解析

在数字化内容生态中,数据驱动的运营决策愈发重要。通过Python爬虫技术,可以高效获取公开平台的结构化数据,进而利用Pandas进行清洗与挖掘。本文以B站动漫区为例,介绍从API数据采集、字段解析到互动率计算、播放量分级的完整流程,并结合PyECharts实现交互式可视化大屏。数据分析揭示播放量与弹幕量的相关性、内容类型的长尾分布等规律,为内容运营与爱好者提供参考。该方法适用于入门至进阶的Python学习者,一台普通电脑即可运行。

weixin_42537831的博客 321

NAT反向代理技术的实现(外网访问内网)

NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的

joyousmime的博客 8489

探索B站API宝藏:SocialSisterYi/bilibili-API-collect

探索B站API宝藏:SocialSisterYi/bilibili-API-collect bilibili-API-collect哔哩哔哩-API收集整理【不断更新中....】项目地址:https://gitcode.com/gh_mirrors/bi/bilibili-API-collect 在这个数字化时代,我们经常需要借助开放接口(API)来获取和利用数据。对于喜欢二次元文化和视频分享平...

gitblog_00054的博客 2614

ECU-TEST新手入门:从软件申请到第一个测试包创建的完整保姆级流程

本文详细介绍了ECU-TEST软件从申请试用、安装配置到创建第一个测试包的完整流程。针对新手用户,提供分步指导,包括界面认知、测试组件添加、变量定义及执行结果分析,帮助快速掌握汽车电子测试工具的基本操作。特别说明试用授权的两种获取方式和安装注意事项。

weixin_30606461的博客 481

bilibili常用接口

首页模块 推荐视频 https://www.bilibili.com/index/ding.json 搜索模块 默认搜索词 http://api.bilibili.cn/x/web-interface/search/default 搜索热词 https://s.search.bilibili.com/main/hotword 搜索提示词 http://api.bilibili.cn/suggest 参数 说明 term 搜索词 搜索结果列表(综合排序) https://api.bilib...

zz_lkw的博客 8417

5G中的RedCap

5G中的redcap

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 2527

FPGA控制AD5754实现模数转换Verilog代码与测试激励

本文提供了使用FPGA控制AD5754芯片实现数字信号转模拟信号的Verilog代码和测试激励。AD5754芯片简介:AD5754是一款16位数字信号转模拟信号的芯片。通信方式:FPGA与AD5754之间通过SPI接口进行通信,SPI时钟clk的最大频率为30MHz。模拟输出:AD5754提供了四路模拟输出。工作方式:当前AD5754采用单极性工作方式。指令刷新:根据现有理解,同轴的速度和电流指令应同时刷新。利用LDAC引脚控制模拟信号的刷新,但需实际验证。CLR信号验证。

whm128的博客 248

用 Python 分析B站的变化

作者:HeoiJin,立志透过数据看清世界的产品策划,专注爬虫、数据分析、产品策划领域。博客:https://me.youkuaiyun.com/weixin_40679090由于篇幅过大原因,文章...

Python中文社区 1303

OpenClaw实战系列03:Slack/Telegram国际版接入实战指南

在当今的软件开发和工作流自动化中,将项目管理工具与即时通讯平台集成已成为提高团队协作效率的关键。OpenClaw作为一个开源的自动化工具,通过接入Slack和Telegram国际版,可以实现实时通知、自动化任务触发和团队协作的无缝对接。本文将详细介绍如何实现OpenClaw与这两个主流即时通讯平台的集成。OpenClaw是一个开源的自动化工作流引擎,支持多种触发器和执行器,能够帮助开发团队实现CI/CD流程、任务调度、监控告警等自动化场景。模块化设计:支持插件化扩展多触发器支持。

PeterPan的博客 588

爬取b站视频评论用户信息!这些评论的才是大神!

最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容。 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:https://www.google.cn/chrome/(插件:json-handle 下载地址:http://jsonhandle.sinaapp.com/,json-handle安装方法: https://blog.youkuaiyun.com/xb12369/article/details/7900220.

pythonlaodi的博客 7545

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 635

爬B站视频弹幕数据

爬B站弹幕数据 准备工作 视频链接: https://www.bilibili.com/video/BV1PK4y1b7dt?t=1【周杰伦最新单曲《Mojito》】 弹幕接口: 通过上网搜索,得知B站的弹幕接口为:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX(好像该接口在网页中找不到,所以就先借鉴来使用。ps:oid即为视频的一个编号(不是BV号)) 获取oid: 弹幕接口中的oid怎么获取?通过该链接(在页面检查中可找到):https://api.bi

ytraister的博客 2009

给跨代引用记一本账:Java GC 的分配路径、卡表写屏障与收集器版图快速回顾

本文把 Java GC 的零散名词串成一条推理链路:从 TLAB 指针碰撞分配、逃逸分析,到 Eden、Survivor 与晋升的四条路,重点拆解卡表与写屏障如何为老年代指向新生代的引用记账,及 Minor GC 如何只扫脏卡。基于 JDK 8 实测:分散写使 Young GC 停顿涨 10~15 倍,条件卡标记消除卡表伪共享,计数循环让 System.gc 等待 2.7 秒,Survivor 过小使晋升量增加约 400 倍。文末梳理 JDK 8 到 27 的收集器演进、选型路径与排查顺序。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 17万+

B站视频信息爬虫python

import warnings import requests from bs4 import BeautifulSoup from pymongo import MongoClient import datetime import time #忽略警告提示 warnings.filterwarnings("ignore") #b站视频链接/地址 title_url = 'https://w...

The_Legend_of_1900的博客 704

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网页抓取API,让数据获取更简单

网页抓取 API 是一种结合了网页抓取的灵活性与 API 的标准化便利性的工具。如果你希望在享受 API 的简便性之余,又能全面掌控网页抓取过程,Bright Data 的全功能网页抓取服务是理想选择。接下来,我们将通过一个真实测评,带您深入体验 Bright Data 网页抓取 API 的便捷与强大。首先,官方提供了常用的242种API,这些接口覆盖了丰富的行业应用,比如 Marketplace 数据、B2B 数据、电子商务数据、房地产数据等,满足你的各种数据采集需求。

商务合作欢迎私信我 3万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python3网络爬虫--爬取b站用户投稿视频信息(附源码)

上次写了篇 python3网络爬虫–爬取b站视频评论用户信息(附源码) 效果良好,因此再写一篇爬取用户投稿视频的爬虫,思路简单一些。不过本次将数据存储到了MySQL数据库。 本次要实现:手动输入用户id,程序根据这个id爬取此用户的所有投稿视频,最终将数据存储到MySQL数据库中,并且数据存储到以用户名为数据表名的数据表中。 一.准备工作 1.工具 (1)chrome浏览器 下载地址:https://www.google.cn/chrome/,用于分析网结构。 jsonhandle 用于分析json格式化数

懷淰メ的博客 7087

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python 处理B站视频数据,数据存本地

上一个已经通过B站的API,来实现了对数据的读取,这篇文章就是,将数据存储在本地的TXT文件中。PS :数据的格式:时间,ID,标题,数字。还是要吐槽一下b站后台,显示的不炫酷。此功能基本实现对数据的自动统计。实现大概分为三个步骤。

伪NChris的博客 887

B站热门榜单爬虫+可视化(详细过程和解释)

数据爬取和保存数据分析和可视化及页面展示和保存

m0_72116042的博客 3139

如何快速掌握BilibiliHistoryFetcher:面向B站用户的完整数据分析工具指南

你是否曾好奇自己在B站到底看了多少视频?哪些UP主最吸引你?你的观看习惯又有哪些规律?现在,通过**BilibiliHistoryFetcher**这个强大的开源工具,你可以轻松获取、分析并可视化你的B站观看历史数据。这款专门为哔哩哔哩用户设计的数据分析工具,让每个人都能成为自己观影习惯的专家。 ## 🎯 核心价值:为什么你需要这个工具? **BilibiliHistoryFetcher**

gitblog_00792的博客 1092

如何用Python快速爬取B站全站视频信息

B站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆。不过纸上得来终觉浅,绝知此事要躬行,我码故我在。最终爬取到数据总量为 760万 条。 准备工作 首先打开 B 站,随便在首页找一个视频点击进去。常规操作,打开开发者工具。这次是目标是通过爬取 B 站提供的 api 来获取视频信息,不去解析网页,解析网页的速度太慢了而且容易被封 ip。 勾选 JS 选项,F5 刷新

Just for fun的专栏 8565

BiliOB观测者爬虫系统揭秘:如何精准抓取B站UP主与视频数据

BiliOB观测者是一个观测B站UP主及视频数据变化,并予以分析的Web应用程序。其核心功能依赖于高效稳定的爬虫系统,能够精准获取B站平台的公开数据,为用户提供全面的数据分析支持。 ## 爬虫系统的核心架构 BiliOB观测者的爬虫系统主要通过`biliob-spider`模块实现,该模块专注于B站数据的抓取与处理。系统采用分层设计,确保数据采集的高效性和可靠性。 ### 数据抓取流程解析

gitblog_00446的博客 298
上一篇: SaToken+Redis性能优化指南:如何避免序列化坑与高并发瓶颈
下一篇: F2FS文件系统工具全解析:从安装到实战应用(含常见问题解决方案)
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值