python爬虫b站网页视频信息

目录

1.安装selenium库

2.安装Chrome浏览器+Driver(驱动)

找到的非官方网址

了解版本号

配置环境变量

3.爬取目标网址

1.此处加入了滚动页面

2.观察翻页url变化规律,加入翻页,将数据存储到excel

4.遍历网址,爬取数据

获取的数据包括:点赞,投币,收藏,转发


1.安装selenium库

对于爬取动态加载的b站需要使用动态抓取工具,于是乎安装该库,与requests+bs4说再见~

据调查可能是电脑中python版本过多导致pip直接安装失败报错,参考了这个

镜像安装版:python -m pip install selenium-i http://pypi.mirrors.ustc.edu.cn/simple/

无镜像:python -m pip install selenium

发现镜像不太行但是用这个m指令直接安装就行,与此同时也顺便找了一些可替换的镜像网址。

  阿里云 http://mirrors.aliyun.com/pypi/simple/ 
  中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 
  豆瓣(douban) http://pypi.douban.com/simple/ 
  清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 
  中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

总而言之,解决。 

2.安装Chrome浏览器+Driver(驱动)

其他浏览器也可以,鉴于Chrome我有,接下来找Driver就是了。

找到的非官方网址

Chrome for Testing availability (googlechromelabs.github.io)

CNPM Binaries Mirror (npmmirror.com)

离谱,匹配不上,两眼一黑(最烦兼容问题了)。

了解版本号

Chrome 和 ChromeDriver 的版本号通常由以下格式构成:

主版本号.次版本号.修订版本.补丁版本

兼容性说明:

    1.    主版本号必须匹配:

  • 在 Chrome 和 ChromeDriver 中,只要主版本号一致,通常表示基础协议兼容。

    2.    次版本号和修订版本一般必须匹配:

  • 次版本号和修订版本一致,说明核心功能和接口一致。这表示它们在协议和功能实现上是兼容的。

    3.    补丁版本差异通常无大碍:

  • 补丁版本(最后一部分数字)主要用于修复 bug 或优化性能,通常不会引入与 WebDriver 相关的重大变化。
  • 在绝大多数情况下,补丁版本的差异不会影响兼容性。

所以这么说来只要前三点一致就可以随便捡一个装。

配置环境变量

参考这个

3.爬取目标网址

1.此处加入了滚动页面

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化 Selenium WebDriver
driver = webdriver.Chrome()

# Bilibili 搜索页面的 URL
url = 'https://search.bilibili.com/all?keyword=%E7%BE%8E%E9%A3%9F%E5%88%B6%E4%BD%9C&search_source=1&order=stow&pubtime_begin_s=1717171200&pubtime_end_s=1725206399'

# 打开网页
driver.get(url)

# 等待页面加载完成
time.sleep(5)

# 滚动页面以加载更多内容(适用于无限滚动页面)
scroll_pause_time = 2
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 向下滚动页面
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(scroll_pause_time)
    # 计算滚动后的新高度
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# 等待动态元素加载(使用显式等待,确保抓取稳定)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'bili-video-card__wrap')))

# 找到视频卡片元素
video_items = driver.find_elements(By.CLASS_NAME, 'bili-video-card__wrap')

# 使用一个集合来存储唯一的视频网址
unique_urls = set()

for item in video_items:
    try:
        # 查找视频链接元素
        link_tag = item.find_element(By.TAG_NAME, 'a')
        video_url = link_tag.get_attribute('href')
        # 检查是否重复
        if video_url and video_url not in unique_urls:
            unique_urls.add(video_url)
            print(f"视频网址: {video_url}")
    except Exception as e:
        print(f"跳过异常条目: {e}")

# 输出总共找到的视频网址数量
print(f"找到的条目数: {len(unique_urls)}")

# 关闭浏览器
driver.quit()

2.观察翻页url变化规律,加入翻页,将数据存储到excel

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化 Selenium WebDriver
driver = webdriver.Chrome()
#建立网址集合
find_urls = set()

# Bilibili 搜索页面的 URL
base_url = "https://search.bilibili.com/all?vt=13186900&keyword=%E7%BE%8E%E9%A3%9F%E5%88%B6%E4%BD%9C&search_source=1&order=stow&pubtime_begin_s=1717171200&pubtime_end_s=1725206399"
for page in range(1, 29):  # 爬取前28页
    url = f"{base_url}&page={page}"
    driver.get(url)
    # 等待页面加载完成
    time.sleep(3)
    # 滚动页面以加载更多内容(适用于无限滚动页面)
    scroll_pause_time = 2
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        # 向下滚动页面
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(scroll_pause_time)
        # 计算滚动后的新高度
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    # 等待动态元素加载(使用显式等待,确保抓取稳定)
    wait = WebDriverWait(driver, 10)
    wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'bili-video-card__wrap')))

    # 找到视频卡片元素
    video_items = driver.find_elements(By.CLASS_NAME, 'bili-video-card__wrap')

    # 使用一个集合来存储唯一的视频网址
    unique_urls = set()

    for item in video_items:
        try:
            # 查找视频链接元素
            link_tag = item.find_element(By.TAG_NAME, 'a')
            video_url = link_tag.get_attribute('href')
            # 检查是否重复
            if video_url and video_url not in unique_urls:
                unique_urls.add(video_url)
        except Exception as e:
            print(f"跳过异常条目: {e}")
    #将网址加入总网址集合        
    find_urls = find_urls.union(unique_urls)
    # 输出找到的视频网址数量
    print(f"找到的条目数: {len(unique_urls)}")

# 输出总共找到的视频网址数量
print(f"找到的条目数: {len(find_urls)}")

# 关闭浏览器
driver.quit()


import pandas as pd
# 转换为列表,确保无重复
urls_list = list(find_urls)
# 检查集合中元素数量
print(f"集合中共有 {len(find_urls)} 条独特链接:")
# 创建单列 DataFrame
df = pd.DataFrame(urls_list, columns=["Video URL"])
# 保存到 Excel 文件
excel_file = "video_linkspage1000.xlsx"
df.to_excel(excel_file, index=False)

print(f"所有链接已保存到 {excel_file}")

4.遍历网址,爬取数据

获取的数据包括:点赞,投币,收藏,转发

(用了xpath定位,别的我都看花眼了)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import numpy as np

links1000 = pd.read_excel('video_links10001.xlsx')['Video URL']
results = []
# 初始化 WebDriver
driver = webdriver.Chrome()
for link in links1000:
    driver.get(link)
    # 等待元素加载并获取,QEWR(点赞,投币,收藏,转发)
    wait = WebDriverWait(driver, 30)
    video_Q = wait.until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="arc_toolbar_report"]/div[1]/div/div[1]/div/span'))  #XPATH
    )
    video_E = wait.until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="arc_toolbar_report"]/div[1]/div/div[2]/div/span'))
    )
    video_W = wait.until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="arc_toolbar_report"]/div[1]/div/div[3]/div/span'))
    )
    video_R = wait.until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="share-btn-outer"]/div/span'))
    )
    # 获取数据
    video_Qnum = video_Q.text
    video_Enum = video_E.text
    video_Wnum = video_W.text
    video_Rnum = video_R.text
    # 添加到列表
    results.append({
        "链接": link,
        "点赞数": video_Qnum,
        "投币数": video_Enum,
        "收藏数": video_Wnum,
        "转发数": video_Rnum
    })

# DataFrame
data = pd.DataFrame(results)
# 保存结果
data.to_excel('video_data_results.xlsx')
print("数据已保存")

# 关闭浏览器
driver.quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值