欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫:Selenium爬取B站视频标题、播放量、发布时间

程序员文章站 2024-03-25 18:17:40
...

上次尝试了利用Ajax机制爬取B站视频播放量等数据(链接在下方),但是发现响应的JSON数据中没有发布时间的数据,这次决定用Selenium试一下。
python爬虫:Ajax爬取B站视频标题、播放量、评论量.

Selenium

Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面源代码,做到可见即可爬。相比于之前的爬虫它的速度会慢一些,但不会被Ajax动态加载等反爬机制干扰,可以直接进入开发者模式查找元素。

具体实现

先来看一下爬取的这个页面,是b站一位up主的主页,全部视频共有21页。
python爬虫:Selenium爬取B站视频标题、播放量、发布时间
接下来导入库。

from selenium import webdriver
from selenium.webdriver import ChromeOptions
import pandas as pd

声明浏览器对象并定义URL,URL包含一个page参数,代表当前页面。

option = ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
browser.implicitly_wait(10) 
INDEX_URL = 'https://space.bilibili.com/390461123/video?tid=0&page={page}&keyword=&order=pubdate'
TOTAL_PAGE = 21

这里加上“headless”这个参数后运行时就不会跳出一个新的浏览器窗口。implicitly_wait是设置隐式延时等待,防止出现找不到元素的错误(页面加载不及时)。
我们再定义几个list保存爬取的数据。

title_list, play_list, time_list = [], [], []

接下来我们打开浏览器开发者模式,查找我们需要的元素。
python爬虫:Selenium爬取B站视频标题、播放量、发布时间
找到了元素的class,我们就可以用css选择器来选取元素。

def scrape_index(page):
    url = INDEX_URL.format(page=page)
    browser.get(url)
    title = browser.find_elements_by_css_selector('.small-item .title')
    play = browser.find_elements_by_css_selector('.small-item .play')
    time = browser.find_elements_by_css_selector('.small-item .time')
    for item in title:
        title_list.append(item.text)
    for item in play:
        play_list.append(item.text)
    for item in time:
        time_list.append(item.text)        

这里定义了一个爬取页面的方法,把页码作为参数传进去。再用css选择器获取节点。获取的节点的类型都是 WebElement,多个节点以列表形式返回。再用text方法获取节点的文本属性即可。

开始爬取,并将结果存入dataframe。

for page in range(1, TOTAL_PAGE + 1):
    scrape_index(page)
 
data = {'title': title_list,
        'play': play_list,
        'time': time_list}
df = pd.DataFrame(data)
df

结果如下。
python爬虫:Selenium爬取B站视频标题、播放量、发布时间
OK,完成。
简单地分析一下数据。

df[df['title'].str.contains("斤")]

python爬虫:Selenium爬取B站视频标题、播放量、发布时间
包含“斤”字的标题有283个。

df[df['title'].str.contains("过瘾")]

python爬虫:Selenium爬取B站视频标题、播放量、发布时间
包含“过瘾”的标题有352个。
这或许是高播放量的秘诀之一?

相关标签: python