python爬虫10 b站爬取使用 selenium+ phantomJS
但有时候
我们不想要让它打开浏览器去执行
能不能直接在代码里面运行呢
也就是说
有没有一个无形的浏览器呢
恩
phantomJS 就是
它是一个基于 WebKit 的浏览器引擎
可以做到无声无息的操作各种动态网站
比如 js,css选择器,dom操作的
所以对于市面上大多通过 js 渲染的动态网站
难以解析的网站
想要爬取的话
就会使用到
selenium + phantomjs
那么怎么玩呢
在这个页面可以看到
我们需要的数据有
名称
视频地址
描述
观看次数
弹幕数量
发布时间
待会我们就把这些数据都爬下来
分析完之后
就开始撸代码了
首先我们要拿到浏览器的对象
browser = webdriver.Chrome()
接着开始访问 b 站
browser.get("https://www.bilibili.com/")
获取到b站首页的输入框和搜索按钮
input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#banner_link > div > div > form > input")))submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="banner_link"]/div/div/form/button')))
在这里的
WAIT.until(EC.presence_of_element_located...
就是等到这个元素可操作的时候才会继续执行下一步
获取到输入框元素后输入「蔡徐坤 篮球」
接着点击搜索
input.send_keys('蔡徐坤 篮球')submit.click()
然而
不妙的事情发生了
b站弹出了一个登录框
正好挡住了我们要操作的搜索
浏览器自动点击搜索之后
这个时候会弹出一个新的窗口
这个窗口里的内容
就是我们要的搜索结果
所以我们要让我们当前的浏览器对象获取到当前的窗口
接着获取到第一页的所有数据
# 跳转到新的窗口print('跳转到新窗口')all_h = browser.window_handlesbrowser.switch_to.window(all_h[1])get_source()
我们还要获取总页数
因为每一页的内容
我们都是要抓取的
total = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.last > button")))return int(total.text)
获取到总页数之后
我们就开始循环
for i in range(2,int(total+1)):next_page(i)
如何获取下一页呢
当然是模拟点击「下一页按钮」的操作
我们获取「下一页按钮」的元素
然后点击
点击之后判断一下是否在我们当前的页数
然后获取数据
print('获取下一页数据')next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#server-search-app > div.contain > div.body-contain > div > 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, '#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.active > button'),str(page_num)))get_source()
有时候可能网速卡
在刷到某一页的时候数据加载不出来
可以来个异常捕获
刷新一下
再递归一下嘿嘿
except TimeoutException:browser.refresh()return next_page(page_num)
获取资源很简单
我们已经用 selenium 跳转到我们要的页面了
那么就拿下当前页面的源码
然后用
来解析一下
最后把数据放到 excel 中
WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix')))html = browser.page_sourcesoup = BeautifulSoup(html,'lxml')save_to_excel(soup)
解析爬取
def save_to_excel(soup):list = soup.find(class_='all-contain').find_all(class_='info')for item in list:item_title = item.find('a').get('title')item_link = item.find('a').get('href')item_dec = item.find(class_='des hide').textitem_view = item.find(class_='so-icon watch-num').textitem_biubiu = item.find(class_='so-icon hide').textitem_date = item.find(class_='so-icon time').textprint('爬取:' + item_title)global nsheet.write(n, 0, item_title)sheet.write(n, 1, item_link)sheet.write(n, 2, item_dec)sheet.write(n, 3, item_view)sheet.write(n, 4, item_biubiu)sheet.write(n, 5, item_date)n = n + 1
最后别忘了关闭浏览器哦
finally:browser.close()
来运行一下项目吧
数据到手
哦~ 对了
不是说还有一个叫做 phantomjs 的么?
简单简单
接下来我们就利用它来打造一个无痕的浏览器
首先我们要下载phantomjs
你可以到
http://phantomjs.org/download.html
这里去下载
下载完之后你需要配置一下环境变量哦
接着回到我们的代码
将 Chrome 换成 phantomjs
browser = webdriver.PhantomJS()
这次我们再来运行项目
这次就是真正的不会打开任何有界面的浏览器了
看下我们抓到的数据
ok~
python爬虫10 b站爬取使用 selenium+ phantomJS的更多相关文章
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- python爬虫:了解JS加密爬取网易云音乐
python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...
- Python爬虫:为什么你爬取不到网页数据
前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- python爬虫学习01--电子书爬取
python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...
- 爬虫动态渲染页面爬取之selenium驱动chrome浏览器的使用
Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,可以用其进行网页动态渲染页面的爬取. 支持的浏览器包括IE(7, 8, 9, 10 ...
- python爬虫+词云图,爬取网易云音乐评论
又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...
随机推荐
- [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
作者:HelloGitHub-小鱼干 JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发.JeecgBoot 采用开发模式:Online Coding 模式-> 代码生成器模式 ...
- RESTfull是什么
经常做接口测试,会看很多接口文档,那怎么识别研发的接口设计是否足够规范,是否符合一些行业标准或准则.那认识了解RESTfull,可以让我们更具有专业性.让我们对接口文档的阅.接口合理性设计识别,做到有 ...
- macvlan几种模式
vepa模式:各个子设备直接无法直接通信(可以通过支持端口聚合的交换机通信),可以和外部通信. private模式:和vepa模式类似,各个子设备之间无法通信,即使通过支持端口聚合的交换机也不能. b ...
- 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!
对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...
- 扫描仪扫描文件处理-imagemagick常用参数
-resize 宽x高(缩放,不变形) -extent 宽x高(放大,不变形)之前设置:-gravity center(重心居中) -brightness-contrast 亮度x对比度(设置亮度对比 ...
- 第十五章 nginx七层负载均衡
一.Nginx负载均衡 1.为什么做负载均衡 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到 ...
- vue知识点12
知识点归纳整理如下: 1. 数组用下标改变,或者对象增加属性,这样的改变数据 是不能触发视图更新的,要用 Vue.set(对象,属性,值) 或this.$set(对象,属性,值) 2. this. ...
- Topsis优劣解距离法 mlx代码
请参考https://blog.csdn.net/qq_36384657/article/details/98188769 mlx代码 topsis 优劣解距离法 参数说明: 分数.获奖次数.价值等 ...
- Codeforces Round #677 (Div. 3) D/1433D Districts Connection
https://codeforces.com/contest/1433/problem/D 找两个不同权值的节点A.B连起来,所有与A不同权值的连到A上,相同的连到B上. #include<io ...
- centos之间如何实现免密ssh登陆
在公司产品中,管理平台和下面的主机很多时候都要求免密,免密的逻辑到底是怎么样的呢?今天就简单看看! 首先创建两台虚机,正常情况下ssh登陆对方是需要密码的 先通过ssh-keygen生成一对秘钥 [r ...