目录
2.观察翻页url变化规律,加入翻页,将数据存储到excel
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()