在headless模式下运行selenium

原文地址:

http://52sox.com/python-use-h...

在Python中进行浏览器测试时,一般我们会选择selenium这样的库来简化我们工作量。而有些时候,为了对一些动态数据进行抓取,我们会选择PhantomJs这样的工具。而在selenium中我们也可以集成Phantomjs对应的驱动,可以很方便的进行对应的操作。
在Phantomjs的官方网站上,我们可以看到类似如下的字样:

Phantomjs

在这里就引申出1个headless mode的概念。而phantomjs与我们常用浏览器的区别就是,它不需要GUI界面也可以运行,因此更为节省资源。
实际上,对于动态数据的抓取问题对我来说已经是很多年之前的事情,无论是基于Phantomjs的casperjs,还是使用Qt、GTK这样的GUI包编写浏览器来进行操作,或者是这里要介绍的selenium的方式,都已经成为过去式了。
而自从在新公司从事新的工作后,对于这样的问题实际上基本上都懒得动手了,不如让同事去做吧。
大概在1个月前,之前公司坐我隔壁的那个哥们写了1个分布式的爬虫框架(实际上关于这方面,个人觉得完全没有必要,流行的scrapy和pyspider那个好用)时遇到了这样1个问题,当时他在selenium中使用Phantomjs对某个页面进行抓取,然后发现有些东西使用Phantomjs抓取不下来,然后只要使用firefox的方式来进行。其博客可以点击
而在不久前,chrome宣布支持headless模式,而后firefox跟随的新闻,再次勾起我无尽的回忆。
实际上,phantomjs这个工具对于Python的人来说很不习惯,而且还有一些莫名其妙的问题。那么,我们就来谈谈在Firefox和Chrome浏览器不原生支持headless模式下,如何使用selenium来实现headless模式进行动态数据的抓取。
在这里为了方便说明,我们在Linux环境下进行操作,使用的版本如下:

Centos==6.8
Python==2.7.10
selenium==2.53.0
Firefox==45.0

在Linux中有1个很好用的工具xvfb,它是1个X服务可以用于在没有显示器的硬件和物理输入设备上运行,详细的操作可以参考。而关于X服务的内容,请自行百度。比较常见的例子在ssh中进行X11转发。
可以看到,在这里我们需要借助xvfb的方式来实现所谓的headless模式,实际上这个操作就10分钟就完成了。

安装必需的软件包

在这里,我们通过如下的方式安装需要的软件包:

[cat@localhost ~]$ sudo yum install xdg-utils xorg-x11-server-Xvfb xorg-x11-xkb-utils

如果你使用的是基于Debian的系统,比如Ubuntu,那么对应的安装方式可能为:

sudo aptitude install xdg-utils xvfb x11-xkb-utils

安装xvfb的绑定

安装完成xvfb绑定后,一般情况下我们会使用命令的方式来开启虚拟显示。而由于本人比较懒是1个特点,因此我们直接将其与我们的脚本一起集成在一起。
在这里,我们安装1个xvfbwrapper的库,这个库用于在你的Python中开启和关闭xfvb会话。
在这里,我们直接通过pip进行安装:

pip install xvfbwrapper

编写对应的代码

安装完绑定依赖后,我们终于可以愉快的开启编写代码了,在这里我们先引入对应的模块:

from xvfbwrapper import Xvfb

接着我们实例化1个实例:

xvfb = Xvfb()

接着我们就可以开启及关闭其其会话了:

#!/usr/bin/env python

from selenium import webdriver
from xvfbwrapper import Xvfb

xvfb = Xvfb(width=1280,height=720)
xvfb.start()
print('Start...')
browser = webdriver.Firefox()
browser.get('http://52sox.com')
title = browser.title
print(title)
print("Clean...")
browser.close()
xvfb.stop()

在这里,我们将其与selenium进行集成,在这里由于时间的关系,就简单的用于获取个人博客上的标题。
下面我们进行测试:

[cat@localhost ~]$ python headless.py 
Start...
The Kite in the wind
Clean...

发现其可以正常的运行。可以说,简单到没有朋友。

简单到没有朋友

参考文章:

http://tobyho.com/2015/01/09/...


曾经的自己
记录开发中的点点滴滴,共同交流技术。

是1个执着、低调的人

1.9k 声望
161 粉丝
0 条评论
推荐阅读
C-如何快速生成Python的C扩展.md
真的好久没有分享技术文章了,主要是因为自己写的文章太过于小众,没想到自己竟然会分享这样一篇文章。这么一篇浓缩了自己多年来项目开发的实战经验。 不得不说,Python是一门很不错的编程语言。有时候,为了项目代码...

我勒个去阅读 1.9k

封面图
ChatGPT for SegmentFault 插件发布!
ChatGPT for SegmentFault 是一个浏览器插件,帮助你在思否社区查看 ChatGPT 针对每个问题的回答,在你等待人工回答的同时,快速获取到 AI 提供的回答。社区用户间相互帮助会产生更多交流,答案中通常包含一些自...

SegmentFault思否14阅读 2.6k评论 4

封面图
超长溢出头部省略打点,坑这么大,技巧这么多?
在业务中,有这么一种场景,表格下的某一列 ID 值,文本超长了,正常而言会是这样:通常,这种情况都需要超长省略溢出打点,那么,就会变成这样:但是,这种展示有个缺点,3 个 ID 看上去就完全一致了,因此,PM ...

chokcoco14阅读 1.3k评论 3

最好用的 python 库合集
🎈 分词 - jieba优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 {代码...} 🎈 词云库 - wordcloud对数据中出现频率较高的 关键词 生成的一幅图像,予以视觉上的突出 {代码...} 🎈 ...

tiny极客11阅读 3.5k评论 2

封面图
学会了slidev.js的开发者, 也许可以考虑不用ppt了?
    作为一个开发者, 每次使用PPT或者Word写简历或者述职都好痛苦啊, 这些App也不太适合展示代码, 但是今天来的家人们有福了, 一款叫做是slidev的库露出了邪魅的微笑 官网地址。

lulu_up8阅读 1.3k

CSS 高阶小技巧 - 角向渐变的妙用!
本文将介绍一个角向渐变的一个非常有意思的小技巧!我们尝试使用 CSS 绘制如下图形:在之前,类似的图案,其实我们有尝试过,在 单标签实现复杂的棋盘布局 一文中,我们用单标签实现了这样一个棋盘布局:那么,本...

chokcoco7阅读 926

涨姿势了,殊途同归的图片交互动效制作!
最近,在 CodePen 上,看到一个非常有意思的图片动效,效果如下:原效果链接:CodePen Demo - 1 div pure CSS blinds staggered animation in 13 declarations本身这个动画效果,并没有多惊艳。惊艳的地方在于原...

chokcoco7阅读 1.2k评论 2

是1个执着、低调的人

1.9k 声望
161 粉丝
宣传栏