python爬虫:Selenium爬取B站视频标题、播放量、发布时间
上次尝试了利用Ajax机制爬取B站视频播放量等数据(链接在下方),但是发现响应的JSON数据中没有发布时间的数据,这次决定用Selenium试一下。
python爬虫:Ajax爬取B站视频标题、播放量、评论量.
Selenium
Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面源代码,做到可见即可爬。相比于之前的爬虫它的速度会慢一些,但不会被Ajax动态加载等反爬机制干扰,可以直接进入开发者模式查找元素。
具体实现
先来看一下爬取的这个页面,是b站一位up主的主页,全部视频共有21页。
接下来导入库。
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 = [], [], []
接下来我们打开浏览器开发者模式,查找我们需要的元素。
找到了元素的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
结果如下。
OK,完成。
简单地分析一下数据。
df[df['title'].str.contains("斤")]
包含“斤”字的标题有283个。
df[df['title'].str.contains("过瘾")]
包含“过瘾”的标题有352个。
这或许是高播放量的秘诀之一?
上一篇: Java实现爬取哔哩哔哩视频信息程序
下一篇: java java异常