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

Selenium

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

具体实现

先来看一下爬取的这个页面,是b站一位up主的主页,全部视频共有21页。

python爬取b站视频到指定文件夹 python爬取b站视频的播放量_css


接下来导入库。

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爬取b站视频到指定文件夹 python爬取b站视频的播放量_数据_02


找到了元素的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爬取b站视频到指定文件夹 python爬取b站视频的播放量_python爬取b站视频到指定文件夹_03


OK,完成。

简单地分析一下数据。

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

python爬取b站视频到指定文件夹 python爬取b站视频的播放量_python爬取b站视频到指定文件夹_04


包含“斤”字的标题有283个。

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

python爬取b站视频到指定文件夹 python爬取b站视频的播放量_Selenium_05


包含“过瘾”的标题有352个。

这或许是高播放量的秘诀之一?