前言

在之前提到爬虫时,我想到的步骤大多是:

  1. 查找要爬取内容的页面的url,使用requests库获取响应内容
  2. 内容为html源码则使用BeautifulSoup等工具解析html源码,得到想要的数据
  3. 内容为Json则直接转为Json对象解析
  4. 保存数据

但今天我发现了selenium这个工具,selenium是一套完整的web应用程序测试系统,可以用它来模拟真实浏览器进行测试。在爬虫中使用它的话,我们就可以通过它来与网站进行交互,比如模拟在b站搜索“爱乐之城”,能够获取到搜索结果的页面内容,而不必自己去复制URL了。

使用selenium

安装

python中selenium库的安装依然是傻瓜式:

pip install selenium

不过光有selenium库还不够,还需要下载webdriver,我使用的是chrome浏览器,下载地址:http://npm.taobao.org/mirrors/chromedriver/
下载对应的版本,解压后添加到环境变量中。
查看chrome版本
右上角选项 → \to → 帮助 → \to → 关于Google Chrome,即可查看版本。
添加环境变量
解压后得到的是chromedriver可执行程序,在windows下把它移动到chrome.exe的目录下:
然后添加到环境变量即可。
在ubuntu下则通过sudo mv chromedriver /usr/local/bin即可。

简单使用

访问页面

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.close()

运行后会打开浏览器窗口并访问百度首页。

进行交互

from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
browser.get('http://www.baidu.com')
input = browser.find_element(By.ID, 'kw')
input.send_keys('ipad')
time.sleep(1)
input.clear()
input.send_keys('MacBook pro')
button = browser.find_element(By.ID, 'su')
button.click()
time.sleep(5)
browser.quit()

程序会自动打开百度,输入ipad后清空,再输入MacBook pro并点击搜索。

要爬取的信息

进入b站,搜索爱乐之城,在搜索结果页面按F12审查元素:

我们需要爬取的视频信息有:

  1. 标题
  2. 描述
  3. 观看次数
  4. 弹幕数量
  5. 上传时间
  6. up主
  7. 视频链接

通过审查元素能够看到一个视频的相关信息是一个无序列表的元素,里面包含了我们所需要爬取的信息。

访问b站

根据我们要爬取的内容,需要通过selenium进行的操作包括:

  1. 打开b站首页,输入“爱乐之城”并点击搜索
  2. 在搜索结果页面不断点击“下一页”,获取下一页的搜索结果

访问b站并进行搜索

browser = webdriver.Chrome(options=options)
browser.set_window_size(1400, 900)browser.get('https://bilibili.com')
# 刷新一下,防止搜索button被登录弹框遮住
browser.refresh()
input = browser.find_element(By.CLASS_NAME, 'search-keyword')
button = browser.find_element(By.CLASS_NAME, 'search-submit')
input.send_keys('爱乐之城')
button.click()

刷新一下页面是因为在访问b站时会弹出来一个登陆的弹窗,遮住了搜索按钮导致其无法被点击。

依次访问下一页

首先获取总页数:

total_btn = browser.find_element(By.CSS_SELECTOR, "div.page-wrap > div > ul > li.page-item.last > button")
total = int(total_btn.text)
print(f'总页数: {total}')

对于每一页,都要解析响应的数据并保存:

def get_source():html = browser.page_sourcesoup = BeautifulSoup(html, 'lxml')save_to_excel(soup)

获取下一页:

def next_page(page_num):WAIT = WebDriverWait(browser, 10)   # 设置超时时长为10stry:next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.page-wrap > div > ul > li.page-item.next > button')))next_btn.click()WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div.page-wrap > div > ul > li.page-item.active > button'), str(page_num)))get_source()except TimeoutException:browser.refresh()return next_page(page_num)

为了防止页面未加载出来导致没有成功获取到页面数据,我设置了超时的异常捕获,WAIT.until会每隔0.5s调用一次EC中的方法,直到它返回成功信号或者超时抛出异常。
在上面的代码中,有判断“下一页”这个按钮是否clickable和当前显示的页面是否是指定的页面(page_num

解析数据

使用BeautifulSoup来解析数据:

infos = soup.find_all(class_='video matrix')
for info in infos:title = info.find('a').get('title')href = info.find('a').get('href')desc = info.find(class_='des hide').string.strip()views = info.find(class_='so-icon watch-num').text.strip()barrages = info.find(class_='so-icon hide').text.strip()date = info.find(class_='so-icon time').text.strip()up = info.find(class_='up-name').string.strip()print(f'爬取: {title} up主: {up} 观看次数: {views}')

保存数据可以用xlwt库来写入excel表格文件,也可以转成Json等,这个比较简单就不用说了。

无界面爬虫

在进行调试时打开浏览器窗口还是挺好的,但当我们写好爬虫之后似乎就没必要打开这个窗口了,在之前版本的selenium是通过结合PhantomJS来实现无界面爬虫的,但现在已经转成使用更简洁的headless模式的浏览器了:

from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=options)   # 设置无界面爬虫

运行结果

完整源码:https://github.com/chenf99/python/blob/master/BiliBiliCrawl/crawl.py

参考链接

selenium中查找元素的方法
selenium中的WebDriverWait
selenium中判断元素中是否存在指定的文本

python爬虫之使用selenium爬取b站视频信息相关推荐

  1. Python 爬取B站视频信息 弹幕信息 生成词云统计

    本文介绍功能:实现爬取B站视频信息(用户输入关键词).爬取弹幕信息(支持自定义天数).生成词云图 完整代码地址:https://github.com/736755244/py_bilibili 一.数 ...

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

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

  3. Php使用selenium爬虫,selenium,python爬虫_使用selenium爬取网站时输出结果不正确,selenium,python爬虫 - phpStudy...

    使用selenium爬取网站时输出结果不正确 网站链接:http://www.ncbi.nlm.nih.gov/pubmed?term=(%222013%22%5BDate%20-%20Publica ...

  4. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  5. Python爬虫实战:selenium爬取电商平台商品数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  6. python爬虫———多线程threading模块爬取抖音用户信息

    爬虫背景: 由于原来的数据库中有1.5亿左右的用户id,但是其中有1.2亿的用户资料是不完整的(没有粉丝数量,点赞数量等,算是无用数据),现在老板要求将这些没有资料的用户更新信息,咋办? 刚开始的想法 ...

  7. Python爬虫实战+Scrapy框架 爬取当当网图书信息

    1.环境准备 1.在python虚拟环境终端使用 pip install scrapy下载scrapy依赖库 2.使用scrapy startproject book创建scrapy心目工程 3.使用 ...

  8. 爬虫学习笔记——Selenium爬取淘宝商品信息并保存

    在使用selenium来模拟浏览器操作,抓取淘宝商品信息前,先完成一些准备工作. 准备工作:需要安装selenium,pyquery,以及Chrome浏览器并配置ChromeDriver. 安装sel ...

  9. Python爬虫-利用xpath解析爬取58二手房详细信息

    文章目录 前言 介绍 代码 运行结果截图 前言 简单的Python练习,对页面中的某些部分的文字进行爬取 介绍 xpath解析: 最常用且最便捷高效的一种解析方式.通用型.-xpath解析原理:- 1 ...

最新文章

  1. 程序可以在硬件之间发送吗_你知道硬件、软件工程师之间,还有一个固件工程师吗?...
  2. First Unique Character in a String(leetcode387)
  3. Windows Server 2016-命令行Ntdsutil迁移FSMO角色
  4. 20+ 家标杆车企实践总结,数字化转型的秘诀都在这儿
  5. 浅析软件项目管理中十个误区(来自:http://manager.csdn.net/n/20051213/30907.html)
  6. 线性表的顺序存储 c语言表达,线性表的基本操作顺序存储(C语言).doc
  7. Python 和 R 数据分析/挖掘工具互查
  8. 报错,java.lang.NoSuchMethodException: java.awt.print.Pageable
  9. Python中常用的模块和高级语法整理总结
  10. 【常见的检索源期刊】SCI+EI(核心)+ISTP+CSSCI+SSCI+AHCI简介
  11. Java MD5加密工具类
  12. KK音标和国际音标的对照
  13. ICML2022论文解读『Sparse Double Descent: Where Network Pruning Aggravates Overfitting』
  14. 信息不对称套利之 - 羊毛党
  15. 红尘牵绊,江湖儿女惹情长
  16. 3d计算机原理,3d的技术原理有哪些
  17. win10亮度进度条不见了
  18. 计算机考研复试C语言常见面试题
  19. 【IoT】物联网NB-IoT之移动oneNET平台简析
  20. 电位器和编码器的区别

热门文章

  1. 计算机各配置性能如何区分,怎么测试电脑性能?判断电脑性能主要看什么?
  2. 2.5.3 文法二义性的消除
  3. 使用gb2312乱码,utf-8正常
  4. android -- 蓝牙 bluetooth解读
  5. 看门狗性能软件测试,《看门狗:军团》PC版性能表现分析
  6. 6.2 不一致数据的转换
  7. 常用的Git代码托管平台
  8. 双目立体匹配修炼之路
  9. ARP协议及局域网断网攻击(scapy)
  10. 体验在终端——参加2012年移动开发者大会有感