使用Python+Selenium实现获取b站视频数据

532 阅读2分钟

首先先说明,这个方法获取速度并不快,不如用专门的框架获取更快,仅仅是上班无聊摸鱼的时候写着玩的。

运行环境

python3.10.8

selenium4.4.3

为了收集视频数据我们要做这几个事情

  1. 搜索视频
  2. 进入视频详情页面
  3. 获取标题、播放量等等数据

最终呈现的效果是这样的(多出来的好像是等待的报错,没有特意处理)

image.png

一步步来解决

首先先写搜索视频的代码

    driver.find_element(By.CLASS_NAME,"nav-search-input").send_keys("xxx")
    driver.find_element(By.CLASS_NAME,"nav-search-btn").click()

前面省略了启动selenium和浏览器的代码,这里需要定位到元素,通过f12直接就能获取

image.png

解决完搜索后开始进行进入视频详情页,进入详情页很简单,不过在这里我遇到一个问题就是页面没法切换过来,所以又想着写了个切换页面的方法(仅适用于有两个页面)

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()