Selenium-无头浏览器
无头浏览器简介
我们日常使用浏览器的步骤为:启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器,能模拟真实的浏览器使用场景。
有了无头浏览器,我们就能做包括但不限于以下事情:
- 对网页进行截图保存为图片或 pdf。
- 抓取单页应用执行并渲染(解决传统 HTTP 爬虫抓取单页应用难以处理异步请求的问题)。
- 做表单的自动提交、UI的自动化测试、模拟键盘输入等。
- 用浏览器自带的一些调试工具和性能分析工具帮助我们分析问题。
- 在最新的无头浏览器环境里做测试、使用最新浏览器特性。
- 写爬虫做你想做的事情。
这里我们简单来说,在selenium中使用无头浏览器。
PhantomJS
PhantomJS是一个无界面的、可脚本编程的WebKit浏览器引擎,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。
- PhantomJS是一个基于webkit内核、无界面的浏览器,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现;
- PhantomJS提供Javascript API接口,可以通过编写JS程序直接与webkit内核交互;
- PhantomJS的应用:无需浏览器的 Web 测试、网页截屏、页面访问自动化、网络监测。
官网:https://phantomjs.org/
github:https://github.com/ariya/phantomjs/
下载安装
打开下载链接:https://phantomjs.org/download.html,根据自己的系统平台,下载相应的包,我这里是Windows 64位系统,所以,
我选择下载windows版本的,phantomjs-2.1.1版本下载地址:
将压缩包解压到没有中文、空格的目录,我这里解压到Python的安装目录中的Scruots目录。
测试
import time # 1、导入webdriver from selenium import webdriver # 2、实例化指定浏览器的webdriver对象,必须指定phantomjs的安装路径 driver = webdriver.PhantomJS(executable_path=r"C:\Python\Python37\Scripts\phantomjs\bin\phantomjs.exe") try: # 3、访问指定的url,进行相关操作 driver.get(url="https://www.baidu.com") print("获取title", driver.title) driver.find_element_by_id("kw").send_keys("青城子") driver.find_element_by_id("su").click() # 4、完事后,关闭浏览器 except Exception as error: print(error) finally: time.sleep(2) driver.quit()
PhantomJS 和新版的selenium已经分手,所以你在使用的时候,会有这提示,注意,这是提示,不是报错!
解决办法!要么视而不见,要么按照提示去使用Google或者Firefox的无头浏览器。
Google无头浏览器
Google的无头浏览器配置倒也简单,只需要要在实例化driver对象的时候,添加参数即可:
特别注意:Google无头浏览器无法通过driver.maximize_window()来最大化浏览器,默认Google浏览器运行width:800 height:600 会导致定位失败。
解决方案:通过driver.set_window_size(width,height)来设置浏览器大小,具体根据运行电脑的分辨率来设置。例如:driver.set_window_size(1552,840)
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'tian' __data__ = '2021/2/24 17:06' from selenium import webdriver from selenium.webdriver.chrome.options import Options # 创建一个参数对象,用来控制chrome已无界面模式打开 chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") # 创建浏览器对象 driver = webdriver.Chrome(chrome_options=chrome_options) driver.implicitly_wait(10) #driver.maximize_window() 对无头谷歌浏览器是无效的,无头浏览器默认按照width:800 height:600窗口大小运行,会导致定位失败。
# 解决方案设置无头浏览器运行时的高和宽,根据运行电脑的屏幕来设置
driver.set_window_size(1552,840) try: driver.get("https://www.baidu.com/") print(driver.title) # 百度一下,你就知道 except Exception as error: print("报错信息:{0}".format(error)) finally: driver.quit()
Firefox无头浏览器
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'tian' __data__ = '2021/2/24 17:06' from selenium import webdriver from selenium.webdriver.firefox.options import Options # 创建浏览器对象 options = Options() options.add_argument("--headless") driver = webdriver.Firefox(firefox_options=options) driver.implicitly_wait(10) try: driver.get("https://www.baidu.com/") print(driver.title) # 百度一下,你就知道 except Exception as error: print("报错信息:{0}".format(error)) finally: driver.quit()