什么是無頭瀏覽器?
無頭瀏覽器,我理解的就是執行腳本的時候,不會打開瀏覽器的界面,但是代碼依舊會執行
無頭瀏覽器什么時候用?
測試的時候需要打開瀏覽器,但是打開瀏覽器會影響正常的操作電腦,無法在同一台計算機上繼續工作,
或者在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)
無頭很簡單,代碼不變,只是加了無頭配置
上述代碼中與原來的發郵件代碼不同的地方如下:

結束!
