14.爬蟲---Selenium 經典動態渲染工具的使用

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 支持非常多的瀏覽器,如 ChromeFirefoxEdge

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如何選取元素
序號方法描述
1find_element_by_id()通過ID定位元素
2find_element_by_name()通過name定位元素
3find_element_by_class_name()通過類樣式名稱定位元素
4find_element_by_tag_name()通過標簽名稱定位元素
5find_element_by_link_text()通過鏈接定位元素(a標簽)
6find_element_by_css_selector()通過CSS定位元素
7find_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()

上面代碼執行邏輯順序:

  1. 打開京東–》休眠2秒
  2. 打開淘寶–》休眠2秒
  3. 打開拼多多–》休眠2秒
  4. 后退到淘寶–》休眠2秒
  5. 后退到京東–》休眠2秒
  6. 前進到淘寶–》休眠2秒
  7. 前進到拼多多

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 窗口就不會再彈出來了,代碼依然正常運行,最后輸出的頁面如圖所示。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44759.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python基礎語法:運算符詳解(算術運算符、比較運算符、邏輯運算符、賦值運算符)②

文章目錄 Python中的運算符詳解一、算術運算符二、比較運算符三、邏輯運算符四、賦值運算符五、綜合示例結論 Python中的運算符詳解 在Python編程中&#xff0c;運算符用于執行各種操作&#xff0c;例如算術計算、比較、邏輯判斷和賦值。了解并掌握這些運算符的使用方法是編寫…

pychopper的安裝與使用

文章目錄 安裝使用 安裝 在Linux環境下使用conda安裝 通常習慣一個軟件一個虛擬環境&#xff1a; conda create -n pychopper -c nanoporetech -c conda-forge -c bioconda "nanoporetech::pychopper"使用 參考官方文檔&#xff1a; https://github.com/epi2me-la…

N-(4-Azido-2-nitrophenyl)-N‘‘-biotinylnorspemidine

?一、基本信息 常用名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine 英文名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine CAS號&#xff1a;786609-83-4 分子式&#xff1a;C22H33N9O4S 分子量&#xff1a;519.62 二、結構特點 該化…

SQL職場必備:掌握數據庫技能提升職場競爭力

&#x1f482; 個人網站:【 摸魚游戲】【網址導航】【神級代碼資源網站】&#x1f91f; 一站式輕松構建小程序、Web網站、移動應用&#xff1a;&#x1f449;注冊地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;輕量化工具創作平臺&#x1f485; 想尋找共同學習交…

vue3 + tsx 表格 Action 單獨封裝組件用法

前言 先上圖看右側列 action 的 UI 效果&#xff1a; 正常來說&#xff0c;如果一個表格的附帶 action 操作&#xff0c;我們一般會放在最右側的列里面實現&#xff0c;這個時候有些UI 框架支持在 SFC 模板里面定義額外的 solt&#xff0c;當然如果不支持&#xff0c;更通用的…

【網絡】SCTP協議概念

SCTP協議 SCTP&#xff08;Stream Control Transmission Protocol&#xff09;是一種傳輸層協議&#xff0c;設計用于提供可靠的數據傳輸服務&#xff0c;同時具備一些類似UDP&#xff08;User Datagram Protocol&#xff09;的屬性。以下是SCTP協議的基本概念、優缺點以及與T…

Linux進行vi編譯代碼出現“E45: ‘readonly‘ option is set (add ! to override)”(完美解決)。

用vi修改文件&#xff0c;保存文件時&#xff0c;提示沒有修改該文件的權限“E45: ‘readonly’ option is set (add ! to override)”的解決方法。 E45: ‘readonly’ option is set (add ! to override) 如果您遇到了“當前用戶沒有權限對文件作修改”的錯誤 1. 檢查文件…

2024.7.11最新版IDM破解,操作簡單

前言 IDM的強勁對手&#xff0c;100%免費&#xff0c;如果破解IDM失敗&#xff0c;推薦使用FDM&#xff0c;下載地址&#xff1a;Free Download Manager 破解步驟 打開PowerShell&#xff0c;非CMD 在左下角開始菜單右鍵點擊后選擇PowerShell&#xff0c;注意不是打開CMD。…

園林類專刊《花卉》簡介及投稿郵箱

園林類專刊《花卉》簡介及投稿郵箱 《花卉》雜志是經國家新聞出版總署批準&#xff0c;廣東省農業科學院主管&#xff0c;廣東省農業科學院環境園藝研究所主辦&#xff0c;面向國內外公開發行林業系統專業期刊&#xff0c;是全國從事林業、園林、生態、環保、旅游、自然資源、…

CentOS7安裝部署git和gitlab

安裝Git 在Linux系統中是需要編譯源碼的&#xff0c;首先下載所需要的依賴&#xff1a; yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下載&#xff1a; wget https://mirrors.edge.kernel.org/pub/s…

【文檔+源碼+調試講解】冷凍倉儲管理系統

摘 要 隨著互聯網時代的到來&#xff0c;同時計算機網絡技術高速發展&#xff0c;網絡管理運用也變得越來越廣泛。因此&#xff0c;建立一個B/S結構的冷凍倉儲管理系統&#xff0c;會使冷凍倉儲管理系統工作系統化、規范化&#xff0c;也會提高冷凍倉儲管理系統平臺形象&#x…

現在國內的ddos攻擊趨勢怎么樣?想了解現在ddos的情況該去哪看?

目前&#xff0c;國內的DDoS攻擊趨勢顯示出以下幾個特征&#xff1a; 攻擊頻次顯著增加&#xff1a;根據《快快網絡2024年DDoS攻擊趨勢白皮書》&#xff0c;2023年DDoS攻擊活動有顯著攀升&#xff0c;總攻擊次數達到1246.61萬次&#xff0c;比前一年增長了18.1%。 攻擊強度和規…

微軟子公司Xandr遭隱私訴訟,或面臨巨額罰款

近日&#xff0c;歐洲隱私權倡導組織noyb對微軟子公司Xandr提起了訴訟&#xff0c;指控其透明度不足&#xff0c;侵犯了歐盟公民的數據訪問權。據指控&#xff0c;Xandr的行為涉嫌違反《通用數據保護條例》&#xff08;GFPR&#xff09;&#xff0c;因其處理信息并創建用于微目…

Shader每日一練(2)護盾

Shader "Custom/Shield" {Properties{_Size("Size", Range(0 , 10)) 1 // 控制噪聲紋理縮放大小的參數_colorPow("colorPow", Float) 1 // 控制顏色強度的指數_colorMul("colorMul", Float) 1 // 控制顏色乘法因子_mainColor("…

多旋翼+VR眼鏡:10寸FPV穿越機技術詳解

FPV&#xff08;First Person View&#xff09;穿越機&#xff0c;是指通過第一人稱視角來駕駛的無人機&#xff0c;特別強調速度和靈活性&#xff0c;常常用于競賽、航拍和探索等領域。結合多旋翼設計和VR眼鏡&#xff0c;FPV穿越機為用戶提供了身臨其境的飛行體驗。 多旋翼技…

數據庫操作和ORM(對象關系映射)框架.creat insert .save區別

1. .create 用途&#xff1a;.create 方法通常用于創建一個新的實體&#xff08;Entity&#xff09;實例&#xff0c;并為其屬性設置初始值。這個方法不會立即將實體保存到數據庫中&#xff0c;而是返回一個配置好的實體實例&#xff0c;該實例可以被進一步修改或用于后續操作…

企業網站被攻擊的常見方式是什么,該如何去做防護

隨著互聯網的普及和人們對網絡使用的增加&#xff0c;網站安全問題變得越來越突出。無論是個人還是企業&#xff0c;都需要了解并采取措施來保護自己的網站和用戶數據的安全。本文介紹常見的網站安全攻擊方式、潛在危害及其預防措施&#xff0c;幫助全面了解網站安全的各個方面…

Vue的常見指令

目錄 1.v-bind 2. class綁定 3.style綁定 4.v-if/v-show 1.v-bind v-bind指令用于綁定屬性 可以簡寫成 “ &#xff1a;” 它的作用就是我們可以動態的定義屬性的值&#xff0c;比如常見的<img src "1.jpg"> 我們如果想要修改圖片就需要獲取到DOM對象&am…

新興市場游戲產業爆發 傳音以技術搶抓機遇

隨著年輕人口的增加以及互聯網的普及&#xff0c;非洲、中東等新興市場正迎來游戲產業的大爆發&#xff0c;吸引著全球游戲企業玩家在此開疆辟土。中國出海企業代表傳音以新興市場需求為中心&#xff0c;秉持本地化創新理念不斷加強游戲等關鍵領域技術攻關憑借移動終端設備為全…

藍卓創始人褚健:工業互聯網平臺技術賦能中小企業數字化轉型的實施路徑

工業4.0是由工業軟件驅動的工業革命&#xff0c;與傳統厚重的工業軟件不同&#xff0c;supOS就好比嵌入工廠的“安卓系統”。如果把一個工廠當作一臺手機&#xff0c;因為有安卓或蘋果開放的操作系統&#xff0c;吸引了全世界聰明的人開發了大量APP供人們使用&#xff0c;手機才…