news 2026/4/16 21:41:49

B站数据可视化避坑指南:用Selenium 3.141.0爬取时遇到的5个典型报错及解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
B站数据可视化避坑指南:用Selenium 3.141.0爬取时遇到的5个典型报错及解决方案

B站数据爬取实战:Selenium 3.141.0常见报错深度解析与可视化方案优化

1. 环境配置的版本陷阱与解决方案

在B站数据爬取项目中,环境配置是最容易踩坑的环节。许多开发者习惯直接安装最新版本的软件和库,但这在爬虫项目中往往会导致兼容性问题。

1.1 ChromeDriver版本匹配问题

最常见的报错之一是SessionNotCreatedException,通常由Chrome浏览器与ChromeDriver版本不匹配引起。以下是推荐的版本组合:

Chrome版本ChromeDriver版本Selenium版本
109.x109.0.5414.x3.141.0
114.x114.x3.141.0

关键操作步骤:

  1. 查看当前Chrome版本:在浏览器地址栏输入chrome://version/
  2. 到ChromeDriver官网下载对应版本
  3. 将ChromeDriver可执行文件放在系统PATH路径下
# 验证环境配置是否正确的测试代码 from selenium import webdriver def test_environment(): try: driver = webdriver.Chrome() driver.get("https://www.bilibili.com") print("环境配置成功!") driver.quit() except Exception as e: print(f"环境配置错误:{str(e)}")

1.2 阻止Chrome自动升级

Chrome的自动升级功能会导致版本不匹配问题突然出现。以下是禁用自动升级的方法(Windows系统):

  1. 打开Chrome安装目录(通常为C:\Program Files\Google\Chrome\Application
  2. 进入Update文件夹
  3. 右键点击GoogleUpdate.exe选择属性
  4. 在安全选项卡中禁用所有用户的执行权限

提示:完成上述操作后,建议定期手动检查更新,确保安全补丁能够及时应用。

2. 元素定位失效的五大场景与应对策略

2.1 XPath定位失效问题

B站前端经常更新DOM结构,导致XPath定位失效。以下是更健壮的定位方案:

# 不推荐的脆弱定位方式 driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/ul/li[1]/div/div[2]/a') # 推荐的相对定位方式 driver.find_element_by_css_selector("a[href*='/video']")

2.2 动态加载内容处理

B站大量使用AJAX加载内容,直接获取元素可能失败。最佳实践是使用显式等待:

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, "div.video-list li") ))

2.3 反爬机制应对方案

B站的反爬策略会随时间变化,常见应对方法包括:

  • 添加合理的请求头
  • 控制请求频率(建议3-5秒/次)
  • 使用随机User-Agent
  • 处理验证码(需要人工干预)
from fake_useragent import UserAgent ua = UserAgent() headers = { 'User-Agent': ua.random, 'Referer': 'https://www.bilibili.com' }

3. 数据清洗与格式转换技巧

3.1 中文数字转换

B站显示数据常包含"万"等中文单位,需要转换为纯数字:

def convert_chinese_number(text): if '万' in text: return float(text.replace('万', '')) * 10000 return float(text) # 示例:将"3.2万"转换为32000 views = convert_chinese_number("3.2万")

3.2 数据存储优化

推荐使用pandas进行数据清洗和存储:

import pandas as pd # 读取爬取的数据 df = pd.read_csv('bilibili_data_raw.csv') # 数据清洗 df['views'] = df['views'].apply(convert_chinese_number) df['date'] = pd.to_datetime(df['date']) # 保存清洗后的数据 df.to_csv('bilibili_data_clean.csv', index=False)

4. 高效可视化方案设计

4.1 Pyecharts高级配置技巧

from pyecharts import options as opts from pyecharts.charts import Bar # 创建柱状图 bar = ( Bar() .add_xaxis(df['title'].tolist()) .add_yaxis("播放量", df['views'].tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="B站视频播放量TOP20"), datazoom_opts=[opts.DataZoomOpts()], # 添加数据缩放 toolbox_opts=opts.ToolboxOpts(), # 添加工具箱 ) ) # 渲染图表 bar.render("bilibili_views_top20.html")

4.2 交互式仪表盘设计

结合多个图表创建综合仪表盘:

from pyecharts.charts import Page page = Page(layout=Page.DraggablePageLayout) page.add( make_bar_chart(), make_pie_chart(), make_line_chart() ) page.render("bilibili_dashboard.html")

5. 性能优化与错误处理

5.1 资源释放策略

不正确的资源释放会导致内存泄漏:

from contextlib import contextmanager @contextmanager def browser_session(): driver = webdriver.Chrome() try: yield driver finally: driver.quit() # 使用示例 with browser_session() as driver: driver.get("https://www.bilibili.com") # 执行爬取操作

5.2 自动化重试机制

from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def scrape_video_info(driver, url): try: driver.get(url) # 提取数据逻辑 return data except Exception as e: print(f"抓取{url}失败: {str(e)}") raise

6. 实战案例分析:热门视频数据抓取

6.1 完整爬取流程

def scrape_bilibili_top100(): with browser_session() as driver: # 访问排行榜 driver.get("https://www.bilibili.com/v/popular/rank/all") # 等待加载 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "li.rank-item"))) # 提取视频列表 videos = [] items = driver.find_elements(By.CSS_SELECTOR, "li.rank-item") for item in items: title = item.find_element(By.CSS_SELECTOR, "a.title").text up = item.find_element(By.CSS_SELECTOR, "a.up-name").text views = convert_chinese_number(item.find_element(By.CSS_SELECTOR, "span.data-box").text) videos.append({ "title": title, "up": up, "views": views }) return pd.DataFrame(videos)

6.2 数据可视化呈现

def create_video_analysis(df): # 播放量分布图 hist = ( Histogram() .add_xaxis(list(range(0, 5000000, 500000))) .add_yaxis("视频数量", df['views'].value_counts(bins=10).tolist()) .set_global_opts(title_opts=opts.TitleOpts(title="播放量分布")) ) # UP主作品数量统计 up_stats = df['up'].value_counts().head(10) bar = ( Bar() .add_xaxis(up_stats.index.tolist()) .add_yaxis("作品数量", up_stats.values.tolist()) .set_global_opts(title_opts=opts.TitleOpts(title="高产UP主TOP10")) ) # 组合图表 page = Page() page.add(hist, bar) return page

7. 高级技巧:处理登录与验证码

对于需要登录才能访问的数据,可以采用以下方案:

from selenium.webdriver.common.action_chains import ActionChains def login_bilibili(driver, username, password): driver.get("https://passport.bilibili.com/login") # 输入用户名密码 user_input = driver.find_element(By.ID, "login-username") user_input.send_keys(username) pwd_input = driver.find_element(By.ID, "login-passwd") pwd_input.send_keys(password) # 处理验证码 try: slider = driver.find_element(By.CSS_SELECTOR, "div.geetest_slider") ActionChains(driver).click_and_hold(slider).move_by_offset(150, 0).release().perform() except: pass # 点击登录 driver.find_element(By.CSS_SELECTOR, "a.btn-login").click() # 等待登录完成 WebDriverWait(driver, 10).until( EC.url_contains("bilibili.com") )

8. 数据存储方案选型

根据数据规模选择合适的存储方案:

数据规模推荐方案优点缺点
<1万条SQLite/CSV简单易用,无需额外服务查询性能有限
1-100万条MySQL成熟稳定,支持复杂查询需要单独部署
>100万条MongoDB灵活扩展,适合非结构化数据学习曲线较陡
# MongoDB存储示例 from pymongo import MongoClient def save_to_mongodb(data): client = MongoClient('mongodb://localhost:27017/') db = client['bilibili'] collection = db['videos'] # 批量插入 if isinstance(data, list): collection.insert_many(data) else: collection.insert_one(data)

9. 定时任务与自动化部署

使用APScheduler实现定时爬取:

from apscheduler.schedulers.blocking import BlockingScheduler def job(): print("开始执行定时爬取任务...") data = scrape_bilibili_top100() save_to_mongodb(data.to_dict('records')) print("任务完成!") scheduler = BlockingScheduler() scheduler.add_job(job, 'cron', hour=3) # 每天凌晨3点执行 try: scheduler.start() except KeyboardInterrupt: scheduler.shutdown()

10. 法律合规与道德考量

在进行网络爬虫开发时,必须注意:

  1. 遵守robots.txt协议
  2. 控制请求频率,避免对目标服务器造成负担
  3. 仅爬取公开可用数据
  4. 不绕过任何技术保护措施
  5. 数据使用需符合最初收集目的

重要提示:商业用途的数据爬取必须获得平台方明确授权,个人学习研究也应注意数据使用范围。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:17:39

GBase 8a数据库双活容灾方案之同步原理(三)

南大通用GBase 8a数据库&#xff08;gbase database)基于列存引擎与分片同步机制&#xff0c;构建了完整的双活容灾方案。核心同步工具GVR依托sync_clientsync_server组件&#xff0c;实现主备集群间增量数据毫秒级同步&#xff0c;点对点速度达450MB/s&#xff0c;支持同城双活…

作者头像 李华
网站建设 2026/4/17 18:03:10

Geomagic Studio 12与Imageware对比:哪款逆向工程软件更适合你的项目?

Geomagic Studio与Imageware深度评测&#xff1a;逆向工程双雄的实战抉择 在数字化设计与制造的浪潮中&#xff0c;逆向工程软件已成为连接物理世界与数字世界的桥梁。当工程师面对一个实物样品需要快速转化为可编辑的3D模型时&#xff0c;Geomagic Studio和Imageware这两款业…

作者头像 李华
网站建设 2026/4/17 9:14:48

Go语言的性能优化

Go语言的性能优化 1. 性能优化的基础概念 1.1 什么是性能优化 性能优化是指通过各种技术手段提高程序的执行效率包括时间复杂度、空间复杂度的优化目标是在保证功能正确性的前提下&#xff0c;提高程序的运行速度和资源利用率 1.2 性能优化的重要性 提高用户体验减少资源消耗降…

作者头像 李华
网站建设 2026/4/16 20:46:45

Python pandas 数据缓存加速技巧

Python pandas 数据缓存加速技巧&#xff1a;提升大数据处理效率 在数据分析领域&#xff0c;Pandas凭借其强大的数据处理能力成为Python生态的核心工具。当数据量达到百万级甚至更大时&#xff0c;重复加载和计算会显著降低效率。这时&#xff0c;合理利用缓存技术可以大幅减…

作者头像 李华