前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >火狐谷歌模拟一个虚拟界面

火狐谷歌模拟一个虚拟界面

作者头像
周小董
发布2019-03-25 15:58:59
9100
发布2019-03-25 15:58:59
举报
文章被收录于专栏:python前行者python前行者

在Python中进行浏览器测试时,一般我们会选择selenium这样的库来简化我们工作量。而有些时候,为了对一些动态数据进行抓取,我们会选择

PhantomJs

这样的工具。而在selenium中我们也可以集成Phantomjs对应的驱动,可以很方便的进行对应的操作。

在Phantomjs的官方网站上,我们可以看到类似如下的字样:

image.png
image.png

在这里就引申出1个headless mode的概念。而phantomjs与我们常用浏览器的区别就是,它不需要GUI界面也可以运行,因此更为节省资源。

实际上,对于动态数据的抓取问题对我来说已经是很多年之前的事情,无论是基于Phantomjs的casperjs,还是使用Qt、GTK这样的GUI包编写浏览器来进行操作,或者是这里要介绍的selenium的方式,都已经成为过去式了。

而在不久前,chrome宣布支持headless模式,而后firefox跟随的新闻,再次勾起我无尽的回忆。

实际上,phantomjs这个工具对于Python的人来说很不习惯,而且还有一些莫名其妙的问题。那么,我们就来谈谈在Firefox和Chrome浏览器不原生支持headless模式下,如何使用selenium来实现headless模式进行动态数据的抓取。

在Linux中有1个很好用的工具xvfb,它是1个X服务可以用于在没有显示器的硬件和物理输入设备上运行,详细的操作可以参考。而关于X服务的内容,请自行百度。比较常见的例子在ssh中进行X11转发。

可以看到,在这里我们需要借助xvfb的方式来实现所谓的headless模式,实际上这个操作就10分钟就完成了。

安装必需的软件包

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

代码语言:javascript
复制
[cat@localhost ~]$ sudo yum install xdg-utils xorg-x11-server-Xvfb xorg-x11-xkb-utils

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

代码语言:javascript
复制
sudo aptitude install xdg-utils xvfb x11-xkb-utils

#安装xvfb的绑定

安装完成xvfb绑定后,一般情况下我们会使用命令的方式来开启虚拟显示。而由于本人比较懒是1个特点,因此我们直接将其与我们的脚本一起集成在一起。

在这里,我们安装1个xvfbwrapper的库,这个库用于在你的Python中开启和关闭xfvb会话。

在这里,我们直接通过pip进行安装:

代码语言:javascript
复制
pip install xvfbwrapper

编写对应的代码

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

代码语言:javascript
复制
from xvfbwrapper import Xvfb

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

代码语言:javascript
复制
xvfb = Xvfb()

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

代码语言:javascript
复制
#!/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()

代码语言:javascript
复制
#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
以下程序亲测在ubuntu16.04下有效,其他环境可能会有错误出现
"""

from selenium import webdriver
from pyvirtualdisplay import Display

# 模拟一个虚拟界面
display = Display(visible=0, size=(1800,1600))
display.start()
driver = webdriver.Firefox(executable_path=r'/home/zhou/soft/geckodriver')
driver.get("https://my.chsi.com.cn/archive/index.action")
print (driver.page_source)

#--------------------------------------------------------------
from selenium import webdriver

#使用62版本chrome,其他版本可能还会有界面
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# driver = webdriver.Chrome(executable_path=r"C:\soft\chromedriver.exe",chrome_options=chrome_options)
driver = webdriver.Chrome(executable_path=r"/home/zhou/soft/chromedriver_linux64/chromedriver",chrome_options=chrome_options)

driver.get('https://account.chsi.com.cn/passport/login?service=https%3A%2F%2Fmy.chsi.com.cn%2Farchive%2Fj_spring_cas_security_check')

page=driver.page_source
print(page)


#------------------------------------------------------------------------------------------
from selenium import webdriver
from pyvirtualdisplay import Display


#模拟一个虚拟界面
display = Display(visible=0, size=(800, 600))
display.start()

# driver = webdriver.Chrome(executable_path=r"C:\soft\chromedriver.exe",chrome_options=chrome_options)
driver = webdriver.Chrome(executable_path=r"/home/zhou/soft/chromedriver_linux64/chromedriver",)

driver.get('https://account.chsi.com.cn/passport/login?service=https%3A%2F%2Fmy.chsi.com.cn%2Farchive%2Fj_spring_cas_security_check')
page=driver.page_source
print(page)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年06月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装必需的软件包
  • #安装xvfb的绑定
    • 编写对应的代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档