Python爬虫实战:自动化采集Niconico周榜传说第一数据

发布时间:2026/9/25 5:42:31

Python爬虫实战:自动化采集Niconico周榜传说第一数据 最近在整理术力口VOCALOID相关数据时发现“周榜传说第一特殊排名”这个数据维度非常有趣它记录了P主Producer创作者在特定周次达成“传说入”即播放量超过100万的里程碑并且是当周首次达成此成就的排名。对于数据爱好者、术力口文化研究者乃至P主本人来说完整收集这份榜单不仅能梳理历史高光时刻更能洞察社区热度变迁。然而相关数据分散在Niconico动画的历史周榜页面中手动收集耗时费力且易出错。本文将分享一套基于Python的自动化数据采集与整理方案从环境搭建、页面解析到数据清洗、持久化存储手把手带你构建一个“周榜传说第一特殊排名”全收集工具。无论你是想为自己的研究项目积累数据还是单纯想学习网络爬虫与数据分析的实战技巧这篇文章都能提供完整的代码和清晰的思路。1. 背景与核心概念解析在深入代码之前我们有必要厘清几个关键概念这有助于理解我们到底要爬取什么以及为什么这么做。术力口与Niconico动画术力口是VOCALOID音乐文化圈的中文俗称其创作视频主要发布在日本视频网站Niconico动画上。Niconico的“周刊VOCALOID排行榜”是衡量作品人气的重要指标。“传说入”与“周榜传说第一”传说入指一首VOCALOID原创歌曲的播放量突破100万次。这是一个极具纪念意义的里程碑。周榜传说第一并非指每周排行榜的第一名而是一个特殊排名。它指的是在某一特定周次的周刊榜上首次达成“传说入”即播放量从999,999突破至1,000,000及以上的歌曲。该周可能有多首歌传说入但“周榜传说第一”特指其中排名最靠前的那一首通常按周刊排名顺序。数据价值收集所有“周榜传说第一”的记录相当于绘制了一份“百万播放里程碑达成时刻”的编年史。我们可以分析哪些P主频繁在周榜登顶时达成传说传说入的密集期对应了哪些社区大事件或潮流从首次传说到周榜传说第一的时间间隔有何规律技术挑战目标数据存在于Niconico历史周榜页面如http://www.nicovideo.jp/ranking/genre/music?termweekpage[page]。我们需要遍历大量历史页面每周一页。从每个页面中精准定位并提取“周榜传说第一”的特殊条目。处理可能存在的页面结构差异、反爬机制和数据缺失情况。2. 环境准备与版本说明本项目主要使用Python进行开发核心库包括requests用于网络请求BeautifulSoup用于HTML解析pandas用于数据整理。以下为推荐环境操作系统Windows 10/11, macOS, 或 Linux (如Ubuntu)。本文示例在Windows 11下演示。Python版本3.8 或更高版本。本文使用 Python 3.9。开发工具任意你喜欢的IDE或文本编辑器如PyCharm、VS Code、Jupyter Notebook。关键第三方库requests: 2.28.1beautifulsoup4: 4.11.1pandas: 1.5.0lxml: 4.9.1 (作为BeautifulSoup的解析器速度更快)项目结构 在开始前建议创建如下目录结构vocaloid_weekly_rank_crawler/ │ ├── main.py # 主程序入口 ├── crawler.py # 爬虫核心逻辑模块 ├── parser.py # 页面解析逻辑模块 ├── utils.py # 工具函数如日志、请求头处理 ├── config.py # 配置文件如起始页、请求间隔 ├── data/ # 数据存储目录 │ ├── raw_html/ # 存放爬取的原始HTML页面可选用于调试 │ └── weekly_first_legend.csv # 最终生成的CSV数据文件 └── requirements.txt # 项目依赖列表3. 核心依赖安装与配置首先创建并激活一个Python虚拟环境推荐然后安装依赖。创建requirements.txt文件requests2.28.1 beautifulsoup44.11.1 pandas1.5.0 lxml4.9.1安装依赖 打开终端或命令提示符进入项目根目录执行pip install -r requirements.txt基础配置 创建config.py文件存放可配置参数。# config.py # 爬虫配置 START_PAGE 1 # 起始周次页码通常最新一周为page1历史页码递增 END_PAGE 50 # 结束周次页码根据需求调整可设置一个较大值由程序判断终止 BASE_URL http://www.nicovideo.jp/ranking/genre/music?termweekpage{page} REQUEST_HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept-Language: ja,en-US;q0.9,en;q0.8, } REQUEST_TIMEOUT 10 # 请求超时时间秒 DELAY_BETWEEN_REQUESTS 2 # 请求间隔时间秒避免对服务器造成压力 # 数据存储配置 RAW_HTML_DIR data/raw_html OUTPUT_CSV_PATH data/weekly_first_legend.csv4. 页面解析逻辑拆解这是爬虫的核心。我们需要分析Niconico周榜页面的HTML结构找到“周榜传说第一”条目的特征。步骤分析获取页面使用requests获取指定页码的周榜页面HTML。定位特殊排名区域观察HTML发现“周榜传说第一”通常被包裹在一个特定的div或section中其class可能包含“legend”、“special”、“first”等关键词。需要实际查看页面源代码确认。提取关键信息从该区域中我们需要提取周次/页码从URL或页面标题中获取。排名通常是“第xx位”。歌曲标题链接文本。视频ID (sm号)从视频链接中提取如sm12345678。P主 (投稿者)名称。达成传说的日期/时间如果页面提供。当周播放数。处理异常某些周次可能没有“周榜传说第一”解析函数需要能处理这种情况并返回None或空值。让我们编写parser.py# parser.py from bs4 import BeautifulSoup import re def parse_weekly_first_legend(html_content, page_num): 从周榜页面HTML中解析出“周榜传说第一”的信息。 Args: html_content (str): 页面的HTML内容。 page_num (int): 当前页码用于标识周次。 Returns: dict or None: 包含解析后数据的字典如果未找到则返回None。 soup BeautifulSoup(html_content, lxml) # 关键步骤1定位特殊排名区域 # 需要根据实际页面结构调整选择器。这里是一个示例选择器。 # 假设特殊条目在一个class为weekly-ranking-special的div里并且包含伝説入り文字。 special_section soup.find(div, class_weekly-ranking-special) if not special_section: # 尝试其他可能的选择器或者直接搜索包含“伝説入り”和“第1位”的文本的父元素 # 这里采用更稳健的文本搜索方式 legend_text_elem soup.find(textre.compile(r伝説入り.*第1位)) if legend_text_elem: special_section legend_text_elem.find_parent(li) or legend_text_elem.find_parent(div) if not special_section: # 本周可能没有传说第一 return None # 关键步骤2提取详细信息 data {page: page_num} # 提取排名通常是“第1位” rank_elem special_section.find(class_re.compile(rrank)) data[rank] rank_elem.get_text(stripTrue) if rank_elem else 第1位 # 提取视频标题和链接 title_link special_section.find(a, hrefre.compile(r/watch/sm\d)) if title_link: data[title] title_link.get_text(stripTrue) href title_link.get(href, ) # 从链接中提取视频ID例如 /watch/sm12345678 - sm12345678 match re.search(rsm\d, href) data[video_id] match.group(0) if match else # 构建完整视频链接 data[video_url] fhttps://www.nicovideo.jp{href} if href.startswith(/) else href else: data[title] data[video_id] data[video_url] # 提取P主信息 (通常在一个class包含user或author的span或a标签里) author_elem special_section.find(class_re.compile(ruser|author)) data[producer] author_elem.get_text(stripTrue) if author_elem else # 提取播放数 (通常在一个class包含view或count的span里) count_elem special_section.find(class_re.compile(rview|count)) if count_elem: count_text count_elem.get_text(stripTrue) # 去除逗号转换为整数 data[weekly_views] int(re.sub(r[^\d], , count_text)) if count_text else 0 else: data[weekly_views] 0 # 提取传说达成时间如果存在可能在某个小字标签里 date_elem special_section.find(textre.compile(r\d月\d日|\d/\d)) data[legend_date] date_elem.strip() if date_elem else return data5. 爬虫核心与调度器实现接下来我们实现爬取单个页面和调度多个页面的逻辑。创建crawler.py。# crawler.py import requests import time import os from typing import Optional, Dict from .config import REQUEST_HEADERS, REQUEST_TIMEOUT, DELAY_BETWEEN_REQUESTS, RAW_HTML_DIR from .parser import parse_weekly_first_legend class WeeklyRankCrawler: def __init__(self): self.session requests.Session() self.session.headers.update(REQUEST_HEADERS) # 确保原始HTML存储目录存在 os.makedirs(RAW_HTML_DIR, exist_okTrue) def fetch_page(self, page_num: int) - Optional[str]: 获取指定页码的周榜页面HTML。 Args: page_num: 周榜页码。 Returns: 页面的HTML文本如果请求失败则返回None。 url fhttp://www.nicovideo.jp/ranking/genre/music?termweekpage{page_num} try: print(f正在抓取第 {page_num} 页...) response self.session.get(url, timeoutREQUEST_TIMEOUT) response.raise_for_status() # 如果状态码不是200抛出HTTPError # 可选保存原始HTML用于调试 with open(os.path.join(RAW_HTML_DIR, fpage_{page_num}.html), w, encodingutf-8) as f: f.write(response.text) return response.text except requests.exceptions.RequestException as e: print(f抓取第 {page_num} 页失败: {e}) return None def crawl_single_page(self, page_num: int) - Optional[Dict]: 爬取并解析单个页面。 Args: page_num: 周榜页码。 Returns: 解析后的数据字典如果页面无数据或解析失败则返回None。 html self.fetch_page(page_num) if not html: return None data parse_weekly_first_legend(html, page_num) return data def crawl_range(self, start_page: int, end_page: int) - list: 爬取指定范围内的所有页面。 Args: start_page: 起始页码。 end_page: 结束页码。 Returns: 所有成功解析的数据字典列表。 all_data [] for page in range(start_page, end_page 1): page_data self.crawl_single_page(page) if page_data: all_data.append(page_data) print(f第 {page} 页解析成功: {page_data.get(title, N/A)}) else: print(f第 {page} 页无‘周榜传说第一’数据或抓取失败。) # 礼貌性延迟避免请求过快 time.sleep(DELAY_BETWEEN_REQUESTS) return all_data6. 数据整合与持久化爬取到的数据需要保存下来。我们使用pandas来处理和保存为CSV文件。创建main.py作为程序入口。# main.py import pandas as pd from crawler import WeeklyRankCrawler from config import START_PAGE, END_PAGE, OUTPUT_CSV_PATH def main(): print( 术力口周榜传说第一特殊排名收集工具启动 ) # 初始化爬虫 crawler WeeklyRankCrawler() # 开始爬取 print(f开始爬取页码范围: {START_PAGE} 到 {END_PAGE}) collected_data crawler.crawl_range(START_PAGE, END_PAGE) if not collected_data: print(未收集到任何数据。请检查网络、页面结构或起始页码。) return # 转换为DataFrame df pd.DataFrame(collected_data) # 数据清洗与排序按页码/周次排序 df.sort_values(page, inplaceTrue) df.reset_index(dropTrue, inplaceTrue) # 添加序号列 df.insert(0, id, range(1, len(df) 1)) # 定义列顺序 column_order [id, page, rank, title, producer, video_id, video_url, weekly_views, legend_date] df df[column_order] # 保存到CSV df.to_csv(OUTPUT_CSV_PATH, indexFalse, encodingutf-8-sig) # utf-8-sig支持Excel直接打开显示中文 print(f数据已成功保存至: {OUTPUT_CSV_PATH}) print(f共收集到 {len(df)} 条记录。) # 打印前几条数据预览 print(\n数据预览:) print(df.head().to_string()) if __name__ __main__: main()7. 运行与结果验证在项目根目录下运行程序python main.py程序将开始逐页抓取并在控制台输出进度。完成后你会在data/weekly_first_legend.csv中得到一个CSV文件。预期输出CSV文件内容示例id,page,rank,title,producer,video_id,video_url,weekly_views,legend_date 1,1,第1位,【初音ミク】Example Song【オリジナル】,ExampleP,sm12345678,https://www.nicovideo.jp/watch/sm12345678,1054321,2023/10/26 2,2,第1位,【鏡音リン】Another Tune【オリジナル曲】,MusicCreator,sm87654321,https://www.nicovideo.jp/watch/sm87654321,1123456,2023/10/19 ...验证用Excel或文本编辑器打开CSV文件检查数据是否完整标题、P主、视频ID等。随机挑选几条记录中的video_url在浏览器中打开确认视频存在且标题等信息匹配。检查page列是否连续是否有大量缺失可能对应没有“传说第一”的周次。8. 常见问题与排查思路在爬虫开发与运行过程中你可能会遇到以下问题问题现象可能原因解决思路程序报错ModuleNotFoundError依赖库未安装或虚拟环境未激活。确认在项目目录下并执行pip install -r requirements.txt。爬取很快但返回空数据或None1. 页面结构已更新CSS选择器失效。2. 网站返回了错误页面或重定向。3. IP或请求频率被限制。1.最重要使用浏览器开发者工具重新检查目标页面的HTML结构更新parser.py中的选择器。2. 打印response.text的前几百字符查看是否包含预期内容。3. 增加DELAY_BETWEEN_REQUESTS或尝试使用代理。请求超时或连接被拒绝网络问题或目标服务器暂时不可用。检查网络连接增加REQUEST_TIMEOUT稍后重试。数据乱码编码问题。确保在读写文件时指定正确的编码如utf-8。保存CSV时使用utf-8-sig便于Excel识别。爬取到一定页数后停止END_PAGE设置不够大或网站历史页面只到某个截止点。观察控制台输出如果连续多页返回“无数据”可能是已到历史数据尽头。可以设置一个较大的END_PAGE让程序自然结束。被封IP请求过于频繁。务必遵守DELAY_BETWEEN_REQUESTS建议设置在3秒以上。对于大规模爬取应考虑使用代理IP池。调试技巧保存原始HTMLcrawler.py中已将每页HTML保存。当解析失败时打开对应的page_xx.html文件用浏览器打开并检查元素修正parser.py中的选择器逻辑。使用print调试在解析函数中临时打印soup的片段确认定位是否正确。分步测试单独运行parser.py用一个本地保存的HTML文件测试解析逻辑。9. 最佳实践与工程建议将一个小脚本提升为更健壮、可维护的项目可以考虑以下优化配置化管理已将URL、请求头、路径等放入config.py方便后续修改。可考虑使用.env文件管理敏感或环境相关配置。日志记录使用Python内置的logging模块替代print可以输出不同级别INFO, WARNING, ERROR的日志到文件和控制台便于后期排查。异常处理与重试网络请求不稳定可以为fetch_page函数添加重试机制如使用tenacity库。增量爬取首次全量爬取后后续只需爬取新页面。可以将已爬取的最大页码记录在文件或数据库中下次从该页码1开始。数据去重与校验保存数据前检查video_id是否已存在避免重复。对关键字段进行非空校验。遵守Robots协议检查https://www.nicovideo.jp/robots.txt尊重网站的爬虫规则。合理设置爬取间隔避免对服务器造成负担。代码模块化如本文所示将爬虫、解析器、配置、工具分离使代码结构清晰易于测试和扩展。考虑使用Scrapy框架如果爬取需求变得非常复杂需要处理登录、JavaScript渲染、大量并发等迁移到Scrapy框架是更专业的选择。10. 总结与扩展方向通过本文我们完成了一个从零开始的、针对特定目标数据的网络爬虫项目。你不仅获得了一份珍贵的“术力口周榜传说第一”数据集更重要的是掌握了分析网页结构、设计解析逻辑、构建稳健爬虫流程的实战能力。核心收获需求分析明确了“周榜传说第一”这一特殊排名的定义和数据价值。工具链熟悉了requestsBeautifulSouppandas这一经典爬虫与数据处理组合。实战流程经历了环境搭建、页面分析、代码实现、数据存储、问题排查的完整开发周期。工程思维引入了配置管理、模块化设计、错误处理和礼貌爬取等工程化实践。扩展方向数据可视化使用matplotlib或plotly绘制“每月传说第一数量趋势图”、“热门P主统计图”等。数据库存储将CSV数据导入SQLite或MySQL便于进行更复杂的查询分析。扩展爬取范围修改解析器同时抓取周榜普通排名数据进行更全面的分析。构建简单Web应用使用Flask或Streamlit创建一个展示此数据集的简单网站。技术是为兴趣和研究服务的。希望这个工具能帮助你更高效地探索术力口文化的数字轨迹。如果在实践过程中遇到新的问题或有了有趣的发现不妨在社区分享你的经验。
延伸阅读

更多相关文章

2026/9/19 20:32:32

功能母粒柔性产线技术:模块化架构与智能调度实践

1. 项目背景与行业痛点 在功能母粒制造领域,传统的大批量生产模式正面临严峻挑战。我从业十年间亲眼见证了市场需求的快速变化——客户对产品个性化、交付周期和品质稳定性的要求越来越高。过去动辄几十吨的订单现在经常被拆分成5-8个不同配方的2-3吨小批量订单&…

2026/9/22 12:33:04

SAP BTP集成中Reverse Proxy与Cloud Connector选型指南

1. SAP BTP集成场景中的连接器选型困境在SAP Business Technology Platform(BTP)的集成架构设计中,如何安全可靠地连接云端应用与本地系统一直是技术决策的关键痛点。最近在为一个跨国零售客户设计混合云集成方案时,我们团队就陷入…

2026/9/25 5:37:47

Atlas 300V 24G NPU推理卡部署YOLO全攻略:环境搭建与模型转换

如果问得再直白一点,Atlas 300V 24G能干的事,跟普通GPU还真不是一回事。前阵子有个搞安防的哥们儿问我,说他准备上一批Atlas 300V 24G做视频结构化,但拿不准这东西算不算“运算加速卡”,怕买回来跟预期的CUDA生态完全对…

2026/9/25 5:37:47

DSC操作误区解析:从样品制备到数据分析

1. 差示扫描量热仪使用误区深度解析差示扫描量热仪(Differential Scanning Calorimeter,简称DSC)作为材料表征的"温度显微镜",在聚合物、制药、食品等领域应用广泛。但很多用户在操作过程中容易陷入以下典型误区&#x…

2026/9/25 5:37:47

低氘水的医学应用与作用机制解析

1. 低氘水研究背景与医学价值低氘水(Deuterium Depleted Water, DDW)是指氘含量低于天然水标准(约150ppm)的特殊水分子结构。这个看似微小的同位素差异,近年来在肿瘤辅助治疗、代谢疾病干预和抗衰老领域展现出独特潜力…

2026/9/25 5:37:47

Agent Skills 设计指南:从工具调用到可组合技能单元的工程实践

最近在折腾 Agent 应用落地,团队里聊得最多的一个东西就是 agent-skills。我们自己的项目从最开始“一个 prompt 里塞一堆工具定义”,慢慢进化到把每个能力拆成独立 Skill 来管理,中间的弯路和踩坑还真不少。这篇就结合我自己实际在项目里拆 …

2026/9/25 5:32:47

AI安全从目标定义开始:机器学习项目避坑指南

1. 为什么“明确目标”是AI安全的第一道防线做机器学习项目这些年,我越来越觉得,模型出问题往往不是算法不够先进,而是目标从一开始就没定清楚。你可能觉得这话有点老生常谈,但我见过太多团队在项目启动会上拍脑袋定一个“提升模型…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑