首先先说明,这个方法获取速度并不快,不如用专门的框架获取更快,仅仅是上班无聊摸鱼的时候写着玩的。
运行环境
python3.10.8
selenium4.4.3
为了收集视频数据我们要做这几个事情
- 搜索视频
- 进入视频详情页面
- 获取标题、播放量等等数据
最终呈现的效果是这样的(多出来的好像是等待的报错,没有特意处理)
一步步来解决
首先先写搜索视频的代码
driver.find_element(By.CLASS_NAME,"nav-search-input").send_keys("xxx")
driver.find_element(By.CLASS_NAME,"nav-search-btn").click()
前面省略了启动selenium和浏览器的代码,这里需要定位到元素,通过f12直接就能获取
解决完搜索后开始进行进入视频详情页,进入详情页很简单,不过在这里我遇到一个问题就是页面没法切换过来,所以又想着写了个切换页面的方法(仅适用于有两个页面)
def switch_page(current_window):
for window_handle in driver.window_handles:
if window_handle != current_window:
driver.switch_to.window(window_handle)
current_window = driver.current_window_handle
return current_window
这个方法就是检查当前有多少网页,判断是否跳转,跳转的话就把目标切换到新的页面上
解决完这个问题再继续看进入详情页,后面的就很简单了,点击、获取内容、退出,按照这一套循环即可
for i in range(0,31):
texts[i].click()
current_window = switch_page(current_window)
sleep(2)
title = driver.find_element(By.CLASS_NAME,"video-title").text
view = driver.find_element(By.XPATH,"//span[@title='总播放数']").text
dm = driver.find_element(By.XPATH,"//span[@title='历史累计弹幕数']").text
sleep(2)
driver.close()
current_window = switch_page(current_window)
print("*********")
print(f"标题:{title},播放量:{view},弹幕数量:{dm}")
这里其实做的很简陋,再想扩充一下就是这一块点击完再点击下一页,或者将获得的内容存进表格再做进一步处理,很多可以往下做的,不过工作摸鱼时间有限,就先写个博客记录一下,完整代码附在下面
from selenium.webdriver.common.by import By
from time import sleep
#用于切换页面的方法
def switch_page(current_window):
for window_handle in driver.window_handles:
if window_handle != current_window:
driver.switch_to.window(window_handle)
current_window = driver.current_window_handle
return current_window
if __name__ == "__main__":
driver = webdriver.Edge("edgedriver_win32\msedgedriver.exe")
driver.get("https://www.bilibili.com/")
current_window = driver.current_window_handle
#定位元素进行搜索
driver.find_element(By.CLASS_NAME,"nav-search-input").send_keys("xxx")
driver.find_element(By.CLASS_NAME,"nav-search-btn").click()
sleep(2)
#用于切换页面
driver.close()
current_window = switch_page(current_window)
#定位元素
texts = driver.find_elements(By.CLASS_NAME,"bili-video-card__info--tit")
for i in range(0,31):
texts[i].click()
current_window = switch_page(current_window)
sleep(2)
title = driver.find_element(By.CLASS_NAME,"video-title").text
view = driver.find_element(By.XPATH,"//span[@title='总播放数']").text
dm = driver.find_element(By.XPATH,"//span[@title='历史累计弹幕数']").text
sleep(2)
driver.close()
current_window = switch_page(current_window)
print("*********")
print(f"标题:{title},播放量:{view},弹幕数量:{dm}")
driver.quit()