专栏首页python前行者火狐谷歌模拟一个虚拟界面

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

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

PhantomJs

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

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

在这里就引申出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分钟就完成了。

安装必需的软件包

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

[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()

#!/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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • unknown error: Chrome failed to start: exited abnormally (Driver info: chromedriver=...)

    Message: unknown error: Chrome failed to start: exited abnormally

    周小董
  • MongoDB数据插入、删除、更新、批量更新某个字段

    查询出hospitalName是xx医院和openId以2开头的所有记录,并且更新my_booking表中的payType为1.

    周小董
  • Firefox driver 那些事~

    1. selenium 3.x开始,webdriver/firefox/webdriver.py的__init__中,executable_path=”geck...

    周小董
  • Python数据处理从零开始----第二章(pandas)(十一)通过列属性对列进行筛选

    该函数的主要格式是:DataFrame.select_dtypes(include = None,exclude = None),返回DataFrame列的子集...

    用户1359560
  • A站凉了,B站上市,微博曲线入局 破壁的二次元市场成巨头盛宴

    上周,二次元视频网站、弹幕鼻祖ACFUN发出“我想再活500年”的微博与百万“猴子”告别,走向长期关闭,让内容行业为之震动。事实上,2017年ACFUN至少已有...

    罗超频道
  • FFmpeg 播放器视频渲染优化

    前文中,我们已经利用 FFmpeg + OpenGLES + OpenSLES 实现了一个多媒体播放器,本文将在视频渲染方面对播放器进行优化。

    字节流动
  • LeetCode 226. 翻转二叉树

    谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

    freesan44
  • Python 实现双向链表

    #!usr/bin/env python #-*- coding:utf-8 -*- """ @author:yzk13 @time: 2018/0...

    YingJoy_
  • PHP对抗web扫描器的脚本技巧

    我们很难保证一个Web程序的安全性,因为鬼知道明天会有什么新的漏洞出现,鬼知道某个模块是不是一个毫无安全意识的程序员编写的。

    用户7657330
  • Python代码分析工具:PyCheck

    PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告。

    py3study

扫码关注云+社区

领取腾讯云代金券