14.Selenium 經典動態渲染工具的使用
- 1.查看chrome瀏覽器版本
- 2.ChromeDriver 安裝
- 3.Selenium 安裝
- 4.驗證安裝
- 5.基本用法
- 5.1啟動瀏覽器
- 5.2導航到頁面
- 5.3查找元素
- 5.3.1單個元素 find_element
- 5.3.2多個元素 find_elements
- 5.4 執行操作
- 5.5 動作鏈ActionChains
- 5.6 執行 JavaScript `execute_script`
- 5.7 WebElement屬性和方法
- 5.8 切換 Frame
- 5.9 瀏覽器窗口操作(切換,前進,后退)
- 5.10 Cookies
- 5.11 延時等待
- 5.12 CDP解決反屏蔽
- 5.13 無頭模式
Selenium-Python中文文檔 https://selenium-python-zh.readthedocs.io/en/latest/
Selenium
是一個自動化測試工具,利用它我們可以驅動瀏覽器執行特定的動作,如點擊、下拉等等操作,對于一些 JavaScript 渲染的頁面來說,此種抓取方式非常有效,下面我們來看下 Selenium 的安裝過程。
1.查看chrome瀏覽器版本
2.ChromeDriver 安裝
ChromeDriver 版本選擇:選擇跟chrome瀏覽器一樣的版本或者接近的版本
-
官方下載:https://sites.google.com/a/chromium.org/chromedriver
官網需要魔法上網,還要登錄 -
其他下載1:https://chromedriver.storage.googleapis.com/index.html
-
其他下載2: https://googlechromelabs.github.io/chrome-for-testing/#stable
可以看這篇文章 chromedriver下載與安裝方法
3.Selenium 安裝
執行如下命令即可:
pip3 install selenium
導入一下 Selenium 包,如果沒有報錯,則證明安裝成功
from selenium import webdriver
Selenium 支持非常多的瀏覽器,如 Chrome
、Firefox
、Edge
等
from selenium import webdriverbrowser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.Safari()
4.驗證安裝
from selenium import webdriver
from time import sleepbrowser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input()
加入input()
是為了讓程序暫停,等待用戶輸入任意字符后才繼續執行下一步操作。這樣做是為了防止程序執行完畢后自動關閉瀏覽器窗口,讓用戶有足夠的時間觀察程序的執行結果或手動進行后續操作。
如果運行完畢之后彈出來了一個 Chrome 瀏覽器并加載了百度頁面,出現chrome正受到自動測試軟件的控制
,那就證明沒問題了。
5.基本用法
- 使用 Selenium 進行自動化測試的一般流程包括:
啟動瀏覽器
:使用 webdriver.Chrome() 或其他瀏覽器類型的初始化函數啟動瀏覽器。
導航到頁面
:調用 driver.get(url) 方法訪問指定的網址。
查找元素
:使用 find_element_by_* 系列方法定位頁面元素,如 find_element_by_id、find_element_by_xpath 等。
執行操作
:對定位到的元素執行點擊、輸入等操作,如 element.click()、element.send_keys(“some keys”)。
關閉瀏覽器
:測試完成后,調用 driver.quit() 關閉瀏覽器。
- selenium如何選取元素
序號 | 方法 | 描述 |
---|---|---|
1 | find_element_by_id() | 通過ID定位元素 |
2 | find_element_by_name() | 通過name定位元素 |
3 | find_element_by_class_name() | 通過類樣式名稱定位元素 |
4 | find_element_by_tag_name() | 通過標簽名稱定位元素 |
5 | find_element_by_link_text() | 通過鏈接定位元素(a標簽) |
6 | find_element_by_css_selector() | 通過CSS定位元素 |
7 | find_element_by_xpath() | 通過xpath語法來獲取元素 |
5.1啟動瀏覽器
from selenium import webdriver
browser = webdriver.Chrome()
input() //
5.2導航到頁面
我們以淘寶為例
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
input()
運行后發現,此時彈出了 Chrome 瀏覽器并且自動訪問了淘寶,然后控制臺輸出了淘寶頁面的源代碼
5.3查找元素
5.3.1單個元素 find_element
比如,想要從淘寶頁面中提取搜索框這個節點,首先要觀察它的源代碼,如圖所示。
可以發現,它的 id 是 q
,name 也是 q
。此外,還有許多其他屬性,此時我們就可以用多種方式獲取它了。比如,find_element_by_name 是根據 name 值獲取,find_element_by_id 是根據 id 獲取。另外,還有根據 XPath、CSS 選擇器等獲取的方式。
find_element
獲取滿足條件的第一個元素find_elements
獲取滿足條件的所有元素
下面我們用代碼實現一下:
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.ID,'q')
input_second = browser.find_element(By.NAME,'q')
input_third = browser.find_element(By.CSS_SELECTOR,'#q')
input_four = browser.find_element(By.XPATH,'//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
print(input_four)
input()
上面我們使用 4 種方式獲取輸入框,分別是根據 ID、NAME、CSS 選擇器、XPath 獲取,它們返回的結果完全一致。
運行結果如下:
<selenium.webdriver.remote.webelement.WebElement (session="322747cbc97f25d32d7e199fe73cf3ab", element="f.4D2DE1B1A752F3ABC3158D83A25383C1.d.832E76F3B106DFD76922F559D8DEE26C.e.2")>
<selenium.webdriver.remote.webelement.WebElement (session="322747cbc97f25d32d7e199fe73cf3ab", element="f.4D2DE1B1A752F3ABC3158D83A25383C1.d.832E76F3B106DFD76922F559D8DEE26C.e.2")>
<selenium.webdriver.remote.webelement.WebElement (session="322747cbc97f25d32d7e199fe73cf3ab", element="f.4D2DE1B1A752F3ABC3158D83A25383C1.d.832E76F3B106DFD76922F559D8DEE26C.e.2")>
<selenium.webdriver.remote.webelement.WebElement (session="322747cbc97f25d32d7e199fe73cf3ab", element="f.4D2DE1B1A752F3ABC3158D83A25383C1.d.832E76F3B106DFD76922F559D8DEE26C.e.2")>
我們來看一下這個 By 類的源碼
from selenium.webdriver.common.by import By
8種選擇方式,對應上面 element_by_XXXX 8種 描述,find_element_by_id(id) 就等價于 find_element(By.ID, id)
不過,selenium 高版本 看樣子是不支持 find_element_by_XXX 這種方式了,建議使用 find_element(By.ID, id) 這種方式
5.3.2多個元素 find_elements
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
for li in lis:print(li.text)
input()
運行結果如下:
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.69")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.70")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.71")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.72")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.73")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.74")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.75")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.76")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.77")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.78")>
<selenium.webdriver.remote.webelement.WebElement (session="534ac2aa5a88454893b18103508d1059", element="f.1EE12A838B8B70DCD9CA4EB62C5951F0.d.57598506BAF39D291C85857AE242A0FD.e.79")>
5.4 執行操作
在淘寶搜索框自動輸入華為手機
兩個字,清除輸入,再次輸入 iphone
,點擊搜索,跳轉到登錄界面,輸入登錄信息
,點擊登錄按鈕,這一系列操作
代碼如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element(By.ID,'q') #選擇搜索輸入框
input.send_keys('華為手機') #輸入華為手機
time.sleep(1)
input.clear() #清除輸入的內容
input.send_keys('iPhone') #輸入iPhone
button = browser.find_element(By.CLASS_NAME,'btn-search') #選擇搜索按鈕
button.click() #點擊搜索按鈕input1 = browser.find_element(By.ID,'fm-login-id') #選擇登錄用戶名輸入框
input1.send_keys('176xxxxxxx9') #輸入登錄用戶名input2 = browser.find_element(By.ID,'fm-login-password') #選擇登錄密碼輸入框
input2.send_keys('123456') #輸入登錄用戶密碼button1 = browser.find_element(By.CLASS_NAME,'password-login') #選擇登錄按鈕
button1.click() #點擊登錄按鈕
input()
通過上面的方法,我們完成了一些常見節點的操作,更多的操作可以參見官方文檔的交互動作介紹 http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
5.5 動作鏈ActionChains
使用xpath定位到元素后,頁面有些內容需要鼠標操作才能顯示,例如雙擊、懸浮或拖拽的操作。可以使用selenium提供的ActionChains類進行鼠標操作
ActionChains的執行原理,當你調用ActionChains的方法時,不會立即執行,而是會將所有的操作按順序放在一個隊列里,當你調用perform()方法時,隊列中的時間會依次執行
ActionChains類提供的鼠標操作,分為兩種動作,一個是鼠標的動作,另一個是執行、清除動作
- ActionChains的動作:
動作方法 | 動作描述 |
---|---|
click (on_element=None) | 單擊鼠標左鍵 |
click_and_hold (on_element=None) | 點擊鼠標左鍵,不松開 |
context_click (on_element=None) | 點擊鼠標右鍵 |
double_click (on_element=None) | 雙擊鼠標左鍵 |
drag_and_drop (source, target) | 拖拽到某個元素然后松開 |
drag_and_drop_by_offset (source, xoffset, yoffset) | 拖拽到某個坐標然后松開 |
key_down (value, element=None) | 按下某個鍵盤上的鍵 |
key_up (value, element=None) | 松開某個鍵 |
move_by_offset (xoffset, yoffset) | 鼠標從當前位置移動到某個坐標 |
move_to_element (to_element) | 鼠標移動到某個元素 |
move_to_element_with_offset (to_element, xoffset, yoffset) | 移動到距某個元素(左上角坐標)多少距離的位置 |
release (on_element=None) | 在某個元素位置松開鼠標左鍵 |
send_keys (*keys_to_send) | 發送某個鍵到當前焦點的元素 |
send_keys_to_element (element, *keys_to_send) | 發送某個鍵到指定元素 |
- 執行、清除動作:
動作方法 | 動作描述 |
---|---|
pause | 動作之間可以暫停 |
perform | 執行動作 |
reset_action | 清除動作 |
示例:
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.csdn.net/")
item = driver.find_element(By.XPATH,'//*[@id="floor-nav_557"]')
#實例化ActionChains,調用鼠標操作,執行鼠標操作
#移動到item元素,停留1s,執行
ActionChains(driver).move_to_element(item).pause(4).perform()
其他一些用法可以看這篇文章:
ActionChains用法
5.6 執行 JavaScript execute_script
對于某些操作,Selenium API 并沒有提供。比如,下拉進度條,它可以直接模擬運行 JavaScript,此時使用 execute_script 方法即可實現,代碼如下:
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.bilibili.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To bilibili")')input()
這里就利用 execute_script 方法將進度條下拉到最底部,然后彈出 alert 提示框。
所以說有了這個方法,基本上 API 沒有提供的所有功能都可以用執行 JavaScript 的方式來實現了。
5.7 WebElement屬性和方法
- WebElement屬性
當我們使用WebDriver的find方法定位到元素后,會返回一個WebElement對象,該對象用來描述Web頁面上的一個元素.WebElement的常用屬性和方法見下表
屬性 | 屬性描述 |
---|---|
id | 標識 |
size | 寬高 |
rect | 寬高和坐標 |
tag_name | 標簽名稱 |
text | 文本內容 |
- WebElement方法
方法 | 方法描述 |
---|---|
send_keys() | 輸入內容 |
clear() | 清空內容 |
click() | 單擊 |
get_attribute() | 獲得屬性值 |
is_selected() | 是否被選中 |
is_enabled() | 是否可用 |
is_displayed() | 是否顯示 |
value_of_css_property() | css屬性值 |
具體可以看這篇文章【Selenium核心技術篇】selenium WebElement屬性和方法
5.8 切換 Frame
我們知道網頁中有一種節點叫作 iframe
,也就是子 Frame,相當于頁面的子頁面,它的結構和外部網頁的結構完全一致。Selenium 打開頁面后,它默認是在父級 Frame 里面操作,而此時如果頁面中還有子 Frame,它是不能獲取到子 Frame 里面的節點的。這時就需要使用 switch_to.frame 方法來切換 Frame
嵌套iframe樣式
<iframe id="one"><iframe id="two"></iframe></iframe>
如何切換樣例
# 1、id定位,通過iframe的 id ="one" 定位并切入 第一個iframe
driver.switch_to.frame(driver.find_element(By.ID,'one'))
# 2、id定位,通過iframe的 id ="two" 定位并切入 第二個iframe
driver.switch_to.frame(driver.find_element(By.ID,'two'))
# 3、切換到當前定位 id="two"的iframe 的父級id="one"的iframe
driver.switch_to.parent_frame()
# 從當前的iframe中切出
driver.switch_to.default_content()
實戰:
#導入模塊
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import By#實例化瀏覽器對象
driver=webdriver.Chrome()# 瀏覽器訪問qq郵箱地址
driver.get("https://mail.qq.com/")# 1、class name定位,通過iframe的 class name ="QQMailSdkTool_login_loginBox_qq_iframe" 定位并切入 第一個iframe
driver.switch_to.frame(driver.find_element(By.CLASS_NAME,'QQMailSdkTool_login_loginBox_qq_iframe'))
# 2、id定位,通過iframe的 id ="ptlogin_iframe" 定位并切入 第二個iframe
driver.switch_to.frame(driver.find_element(By.ID,'ptlogin_iframe'))
# 3、id定位,點擊切換為賬號密碼登錄
driver.find_element(By.ID,'switcher_plogin').click()
# 4、id定位,郵箱賬號輸入框,輸入郵箱賬號123456@qq.com
driver.find_element(By.ID,'u').send_keys("123456@qq.com")
sleep(5)
# 從當前的iframe中切出
driver.switch_to.default_content()# 根據超鏈接使用link_text方法定位"基本版"并點擊
driver.find_element(By.PARTIAL_LINK_TEXT,"基本版").click()input()
效果圖:
5.9 瀏覽器窗口操作(切換,前進,后退)
- 窗口切換
import time
from selenium import webdriver
#1.打開京東官網
browser = webdriver.Chrome()
browser.get('https://www.jd.com/')
print(browser.window_handles)#2.新打開一個瀏覽器窗口,打開淘寶官網
browser.execute_script('window.open()')
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
print(browser.window_handles)#3.新打開一個瀏覽器窗口,打開拼多多官網
browser.execute_script('window.open()')
browser.switch_to.window(browser.window_handles[2])
browser.get('https://www.pinduoduo.com/')
print(browser.window_handles)#4.休眠3秒,切換到第一個窗口,也就是京東官網
time.sleep(3)
browser.switch_to.window(browser.window_handles[0])
input()
運行結果:
#京東
['D6D4DF09BC5DC02586AFE328CD9325D8']
#京東,淘寶
['D6D4DF09BC5DC02586AFE328CD9325D8', 'C0C35009783F322052AFE911854BA439']
#京東,淘寶,拼多多
['D6D4DF09BC5DC02586AFE328CD9325D8', 'C0C35009783F322052AFE911854BA439', 'A00B01BC4E9FD4420270E82FC7D03F1C']
這里首先訪問了京東官網,然后調用了 execute_script
方法,這里傳入 window.open
這個 JavaScript 語句新開啟一個選項卡。接下來,我們想切換到該選項卡。這里調用 window_handles
屬性獲取當前開啟的所有選項卡,返回的是選項卡的代號列表。要想切換選項卡,只需要調用 switch_to.window
方法即可,其中參數是選項卡的代號(列表下標
)。這里我們將第二個選項卡代號傳入,即跳轉到第二個選項卡,接下來在第二個選項卡下打開一個新頁面,然后切換回第一個選項卡重新調用 switch_to.window 方法,再執行其他操作即可。
- 前進,后退
import time
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.jd.com/')
time.sleep(2)
browser.get('https://www.taobao.com/')
time.sleep(2)
browser.get('https://www.pinduoduo.com/')
time.sleep(2)browser.back()
time.sleep(2)
browser.back()
time.sleep(2)
browser.forward()
time.sleep(2)
browser.forward()input()
上面代碼執行邏輯順序:
- 打開京東–》休眠2秒
- 打開淘寶–》休眠2秒
- 打開拼多多–》休眠2秒
- 后退到淘寶–》休眠2秒
- 后退到京東–》休眠2秒
- 前進到淘寶–》休眠2秒
- 前進到拼多多
5.10 Cookies
使用 Selenium,還可以方便地對 Cookies 進行操作,例如獲取、添加、刪除 Cookies 等
from selenium import webdriver
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'xxx', 'domain': 'xxx', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
運行結果:
5.11 延時等待
在 Selenium 中,get 方法會在網頁框架加載結束后結束執行,此時如果獲取 page_source,可能并不是瀏覽器完全加載完成的頁面,如果某些頁面有額外的 Ajax 請求,我們在網頁源代碼中也不一定能成功獲取到。所以,這里需要延時等待一定時間,確保節點已經加載出來。
這里等待方式有兩種:一種是隱式等待,一種是顯式等待。
- 隱式等待(implicitly_wait 方法)
當查找節點而節點并沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是 0。
from selenium import webdriverbrowser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://xxxxxx/')
input = browser.find_element_by_class_name('xxxxxx')
print(input)
- 顯式等待(WebDriverWait 對象)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECbrowser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
# 這里首先引入 WebDriverWait 這個對象,指定最長等待時間,然后調用它的 until 方法,傳入等待條件 expected_conditions
wait = WebDriverWait(browser, 10)
# 在 10 秒內如果 ID 為 q 的節點(即搜索框)成功加載出來,就返回該節點;如果超過 10 秒還沒有加載出來,就拋出異常
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
# 如果 10 秒內它是可點擊的,也就是成功加載出來了,就返回這個按鈕節點;如果超過 10 秒還不可點擊,也就是沒有加載出來,就拋出異常
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
更多等待條件的參數及用法介紹可以參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。
5.12 CDP解決反屏蔽
現在很多網站都加上了對 Selenium 的檢測,來防止一些爬蟲的惡意爬取。即如果檢測到有人在使用 Selenium 打開瀏覽器,那就直接屏蔽。
在大多數情況下,檢測的基本原理是檢測當前瀏覽器窗口下的 window.navigator 對象是否包含 webdriver 這個屬性。因為在正常使用瀏覽器的情況下,這個屬性是 undefined,然而一旦我們使用了 Selenium,Selenium 會給 window.navigator 設置 webdriver 屬性。很多網站就通過 JavaScript 判斷如果 webdriver 屬性存在,那就直接屏蔽。
在 Selenium 中,我們可以使用 CDP
(即 Chrome Devtools-Protocol,Chrome 開發工具協議)來解決這個問題,通過它我們可以實現在每個頁面剛加載的時候執行 JavaScript 代碼,執行的 CDP 方法叫作 Page.addScriptToEvaluateOnNewDocument,然后傳入上文的 JavaScript 代碼即可,這樣我們就可以在每次頁面加載之前將 webdriver 屬性置空了。另外,我們還可以加入幾個選項來隱藏 WebDriver 提示條和自動化擴展信息,代碼實現如下:
from selenium import webdriver
from selenium.webdriver import ChromeOptionsoption = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=option)
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get('https://antispider1.scrape.center/')
5.13 無頭模式
我們可以觀察到,上面的案例在運行的時候,總會彈出一個瀏覽器窗口,雖然有助于觀察頁面爬取狀況,但在有時候窗口彈來彈去也會形成一些干擾。
Chrome 瀏覽器從 60 版本已經支持了無頭模式,即 Headless。無頭模式在運行的時候不會再彈出瀏覽器窗口,減少了干擾,而且它減少了一些資源的加載,如圖片等,所以也在一定程度上節省了資源加載時間和網絡帶寬。
我們可以借助于 ChromeOptions 來開啟 Chrome Headless 模式,代碼實現如下:
from selenium import webdriver
from selenium.webdriver import ChromeOptionsoption = ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
browser.set_window_size(1366, 768)
browser.get('https://www.baidu.com')
print(browser.get_screenshot_as_file('preview.png'))
這里我們通過 ChromeOptions 的 add_argument 方法添加了一個參數 --headless,開啟了無頭模式。在無頭模式下,我們最好設置一下窗口的大小,接著打開頁面,最后我們調用 get_screenshot_as_file 方法輸出了頁面的截圖。
運行代碼之后,我們發現 Chrome 窗口就不會再彈出來了,代碼依然正常運行,最后輸出的頁面如圖所示。