什么是无头浏览器?
无头浏览器,我理解的就是执行脚本的时候,不会打开浏览器的界面,但是代码依旧会执行
无头浏览器什么时候用?
测试的时候需要打开浏览器,但是打开浏览器会影响正常的操作电脑,无法在同一台计算机上继续工作,
或者在linux下运行脚本的时候,无需打开浏览器,只执行代码就行
这时我们就用到了无头浏览器,无需打开浏览器,只需要执行代码
先看一个简单的无头浏览器的配置,以谷歌的无头浏览器为例子
import time from selenium import webdriver # 创建一个参数对象,用来控制chrome以无界面模式打开 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(\'--headless\') # # 浏览器不提供可视化页面 chrome_options.add_argument(\'--disable-gpu\') # 禁用GPU加速,GPU加速可能会导致Chrome出现黑屏,且CPU占用率高达80%以上 # 创建浏览器对象 driver = webdriver.Chrome(options=chrome_options, executable_path=r\'/Users/Downloads/chromedriver\') driver.implicitly_wait(10) # 隐式等待 # 访问URL driver.get(\'https://www.baidu.com\') # 未打开浏览器界面,即可执行代码 print(driver.title) # 百度一下,你就知道 time.sleep(2) # 关闭浏览器 driver.quit()
selenium add_argument 参数表
完整的参数参考官方文档:https://peter.sh/experiments/chromium-command-line-switches/
chrome_options.add_argument(\'--user-agent=""\') # 设置请求头的User-Agent chrome_options.add_argument(\'--window-size=1280x1024\') # 设置浏览器分辨率(窗口大小) chrome_options.add_argument(\'--start-maximized\') # 最大化运行(全屏窗口),不设置,取元素会报错 chrome_options.add_argument(\'--disable-infobars\') # 禁用浏览器正在被自动化程序控制的提示 chrome_options.add_argument(\'--incognito\') # 隐身模式(无痕模式) chrome_options.add_argument(\'--hide-scrollbars\') # 隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument(\'--disable-javascript\') # 禁用javascript,如果觉得速度慢在加上这个 chrome_options.add_argument(\'--blink-settings=imagesEnabled=false\') # 不加载图片, 提升速度 chrome_options.add_argument(\'--headless\') # 浏览器不提供可视化页面 chrome_options.add_argument(\'--ignore-certificate-errors\') # 禁用扩展插件并实现窗口最大化 chrome_options.add_argument(\'--disable-gpu\') # 禁用GPU加速 chrome_options.add_argument(\'–disable-software-rasterizer\') chrome_options.add_argument(\'--disable-extensions\') –user-data-dir=”[PATH]” # 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。 –disk-cache-dir=”[PATH]“ # 指定缓存Cache路径 –first run # 重置到初始状态,第一次运行 --omnibox-popup-count="num" # 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。 --user-agent="xxxxxxxx" # 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果 --disable-plugins # 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果 --disable-java # 禁用java --no-sandbox # 取消沙盒模式 --single-process # 单进程运行 --process-per-tab # 每个标签使用单独进程 --process-per-site # 每个站点使用单独进程 --in-process-plugins # 插件不启用单独进程 --disable-popup-blocking # 禁用弹出拦截 --disable-plugins # 禁用插件 --disable-images # 禁用图像 --enable-udd-profiles # 启用账户切换菜单 --proxy-pac-url # 使用pac代理 [via 1/2] --lang=zh-CN # 设置语言为简体中文 --disk-cache-dir # 自定义缓存目录 --disk-cache-size # 自定义缓存最大值(单位byte) --media-cache-size # 自定义多媒体缓存最大值(单位byte) --bookmark-menu # 在工具 栏增加一个书签按钮 --enable-sync # 启用书签同步
实例:使用无头浏览器登录网易邮箱发送邮件
import time import datetime # 获取当前时间 from getpass import getpass # 输入的密码时不显示 from selenium import webdriver # 登录网易邮箱 def longin(url, username, password): driver.get(url=url) driver.find_element_by_id(\'accname\').send_keys(username) # 输入用户名 driver.find_element_by_id(\'accpwd\').send_keys(password) # 输入用户名 driver.find_element_by_class_name(\'loginbtn\').submit() # 点击登录BTN # 写邮件并发送 def send_email(title, addressee, msg): try: # 先登录 longin(url, username, password) # 1、点击【写信】 driver.find_element_by_class_name(\'p-edit\').click() time.sleep(3) \'\'\' 2、输入收件人和标题 定位时使用某一种方法无法定位到,所以多种定位交叉使用 \'\'\' driver.find_elements_by_class_name(\'right-inner\')[0].find_element_by_name(\'to\').find_element_by_tag_name( \'input\').send_keys(addressee) # 输入收件人 driver.find_elements_by_class_name(\'right-inner\')[0].find_element_by_name(\'to\').find_element_by_tag_name( \'input\').click() # 点击一下收件人输入框,避免下拉框遮挡主题输入框 driver.find_element_by_class_name(\'subject\').find_element_by_tag_name(\'input\').send_keys(title) # 输入主题 \'\'\' 3、输入邮件内容(只有文本) 因为文本框是在ifrme内的,ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作 \'\'\' iframe = driver.find_element_by_id(\'ueditor_0\') # 先获取iframe,定位到它所在的位置 driver.switch_to.frame(iframe) # 切换到iframe中 driver.find_element_by_xpath(\'/html/body\').send_keys(msg) # 在ifrme中操作元素,因为没有id也没有class,所以使用xpath driver.switch_to.default_content() # 切换到iframe上之后,就无法对iframe以外的元素进行操作了,我们需要退出iframe再继续 # 点击【发送】 time.sleep(5) driver.find_element_by_id(\'main\').find_element_by_class_name(\'g-mnc\').find_element_by_xpath( \'//*[@class="g-mnc"]/div[1]/div[1]/div[1]/div[1]\').click() print(\'已发送完成!!!\') finally: time.sleep(3) driver.close() # 不管之前能否成功发送邮件,最后都关闭浏览器 if __name__ == \'__main__\': chrome = r\'/usr/local/bin/chromedriver\' # chrome驱动文件的路径 url = \'https://qiye.163.com/login/?from=ym\' # 邮箱地址 username = input(\'用户名:\').strip() # 邮箱账号 password = getpass(\'密码:\').strip() # 邮箱密码 addressee = input(\'收件人邮箱:\') # 收件人邮箱 title = input(\'邮件标题:\') # 邮件标题 text_msg = input(\'请输入邮件内容(只支持文本类型):\') # 邮件内容 \'\'\' 邮件内容 datetime.datetime.now() 当前时间小数点后还有6位 datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\') 当前时间,只精确到秒 \'\'\' msg = \'{}\n{}\'.format(text_msg, datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\')) \'\'\' 无头浏览器配置 \'\'\' chrome_options = webdriver.ChromeOptions() # 建一个参数对象,用来控制chrome以无界面模式打开 chrome_options.add_argument(\'--no-sandbox\') # 取消沙盒模式,浏览器的安全性会降低,如果不取消,linux下运行会报错 chrome_options.add_argument(\'--disable-dev-shm-usage\') # 解决资源有限的问题 chrome_options.add_argument(\'--headless\') # 浏览器不提供可视化页面 chrome_options.add_argument(\'--disable-gpu\') # 禁用GPU加速 driver = webdriver.Chrome(options=chrome_options, executable_path=chrome) # 创建浏览器对象 driver.implicitly_wait(10) # 隐式等待10s send_email(title, addressee, msg)
无头很简单,代码不变,只是加了无头配置
上述代码中与原来的发邮件代码不同的地方如下:
结束!