但有时候

我们不想要让它打开浏览器去执行

能不能直接在代码里面运行呢

也就是说

有没有一个无形的浏览器呢

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').text item_view = item.find(class_='so-icon watch-num').text item_biubiu = item.find(class_='so-icon hide').text item_date = item.find(class_='so-icon time').text
print('爬取:' + item_title)
global n
sheet.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的更多相关文章

  1. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  2. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  3. python爬虫:了解JS加密爬取网易云音乐

    python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...

  4. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  5. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  6. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  7. python爬虫学习01--电子书爬取

    python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...

  8. 爬虫动态渲染页面爬取之selenium驱动chrome浏览器的使用

    Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,可以用其进行网页动态渲染页面的爬取. 支持的浏览器包括IE(7, 8, 9, 10 ...

  9. python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

随机推荐

  1. ubuntu20 使用命令安装 rabbitmq

    安装 rabbitmq sudo apt-get install erlang-nox -y sudo apt-get update sudo apt-get install rabbitmq-ser ...

  2. 前端传递的json格式与SpringMVC接收实体类的对应关系

    这篇文章主要是帮助刚刚入行的猿猿尽快适应Restful风格的搬砖生活 @RequestBody注解 基本介绍:@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数 ...

  3. Cypress系列(63)- 使用 Custom Commands

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Custom Commands 自定义命 ...

  4. 多测师讲解接口测试 _面试题003_高级讲师肖sir

    接口测试 一.你对HTTP有没有了解过?具体讲一下对http的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...

  5. 多测师浅谈 学员实现价值就是我们的幸福_高级讲师肖sir

    学员实现价值就是我们的幸福 作为一名资深的IT高级讲师,在传统的行业IT薪资基本都是过万,作为一名IT培训教师,培养出在不同领域的测试,并且接触各种各样的产品,目前市场流行的比如银行业务系统,语音类系 ...

  6. rs232转以太网转换器

    rs232转以太网转换器 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升 ...

  7. centos8上安装ImageMagick6.9.10并压缩图片生成webp缩略图

    一,ImageMagick的作用: ImageMagick 是一个用来创建.编辑.合成图片的软件. 它可以读取.转换.写入多种格式的图片. 功能包括:图片切割.颜色替换.各种效果的应用, 图片的旋转. ...

  8. [C#] (原创)一步一步教你自定义控件——03,SwitchButton(开关按钮)

    一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:开关按钮(SwitchButton). 开关按钮非常简单,实现方式也多种多样,比如常见的:使用两张不同的按钮图片,代表开和关,然后 ...

  9. docker 启动容器restart 策略

    docker 运行容器时使用--restart 参数可以指定一个restart策略,来指定容器应该如何重启,或不应该重启,当容器启用restart策略时,将会载docker ps 显示up 或者res ...

  10. 你真的了解Python吗?这篇文章可以让你了解90%

    人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面: 软件质量:在很大程度上,Python更注重可读性.一致性和软件质量,从而与脚本语言世界中的其他工具区别开发.此外,Pyt ...