selenium-自動更新谷歌瀏覽器驅動

1、簡介

selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題,因為有些網頁數據是通過JavaScript動態加載的。selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如輸入、點擊、跳轉等,來拿到網頁渲染之后的結果,可以支持多種瀏覽器。

2、環境安裝

?2.1、安裝selenium庫

pip install selenium

2.2、安裝瀏覽器驅動

我一般使用谷歌瀏覽器,因為谷歌瀏覽器的檢查功能很好用。

1、查看本地Chrome瀏覽器版本

在瀏覽器的地址欄輸入chrome://version,即可查看瀏覽器版本號

2、根據瀏覽器版本號下載對應的驅動程序

驅動程序下載地址:ChromeDriver 下載 - 最新版本 | ChromeDriver 驅動

?下載壓縮包后解壓到對應的文件夾

2.3、測試

運行下面的python腳本,觀察到谷歌瀏覽器自動打開并且訪問百度首頁停留10s退出即表示selenium環境安裝完成。

import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicechrome_options = Options()
# 設置瀏覽器窗口最大化
chrome_options.add_argument("--start-maximized")
# 設置驅動路徑
chromedriver_path = '你的chromedriver.exe文件所在的路徑'
service = Service(executable_path=chromedriver_path)driver = webdriver.Chrome(service=service, options=chrome_options)url = 'https://www.baidu.com/'driver.get(url)time.sleep(10)driver.quit()

3、自動更新谷歌瀏覽器驅動

selenium程序的正確運行需要谷歌瀏覽器和瀏覽器驅動版本號匹配,由于谷歌瀏覽器會自動更新導致需要經常手動更換瀏覽器驅動。

我在網上搜索嘗試了很多關閉谷歌瀏覽器自動更新的辦法,一直沒有起作用。我們從另一個角度:編寫程序自動更新瀏覽器驅動來解決需要手動更新的問題。

3.1、檢查當前谷歌瀏覽器和瀏覽器驅動是否匹配

def test_chrome_driver():# 當前谷歌瀏覽器的驅動路徑driver_path = '你的chromedriver.exe文件所在的路徑'# 初始化chrome瀏覽器的選項chrome_options = Options()# 設置瀏覽器窗口最大化chrome_options.add_argument("--start-maximized")service = Service(executable_path=driver_path)driver = Nonetry:# 創建webdriver對象,傳入配置好的options和servicedriver = webdriver.Chrome(service=service, options=chrome_options)url = "https://www.baidu.com/"driver.get(url)print("當前谷歌瀏覽器版本號和驅動版本號匹配")except Exception as e:# 使用正則表達式從異常信息中提取谷歌瀏覽器版本號pattern = r"Current browser version is (\d+\.\d+\.\d+\.\d+)"match = re.search(pattern, str(e))if match:browser_version = match.group(1)print(f"當前谷歌瀏覽器版本號和驅動版本號不匹配,谷歌瀏覽器版本號為:{browser_version}")return browser_versionfinally:if driver:driver.quit()

匹配運行結果:

不匹配運行結果:

3.2、自動下載對應的谷歌瀏覽器驅動程序

3.2.1、方法一

解析ChromeDriver 下載 - 最新版本 | ChromeDriver 驅動,找到對應版本的驅動程序下載地址

1、瀏覽器版本號和驅動版本號不一定完全相同,一般版本號前三部分相同即可。與瀏覽器版本號前三部分相同的驅動一般有多個,為了保險起見,我們通過一個列表存儲可能匹配的驅動程序下載位置。

2、該網站提供適用于不同系統的驅動程序下載地址,我需要的是后綴為"chromedriver-win64.zip"的下載地址,你可以根據需求自行修改。因為可以下載的驅動版本號有多個,所以可以下載的地址也有多個,保存到一個列表中。

def find_chromedriver_url(browser_version):parts1 = browser_version.split('.')url = "https://www.chromedriverdownload.net/zh/"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}response = requests.get(url=url,headers=headers)# 檢查請求是否成功if response.status_code == 200:tree = etree.HTML(response.text)# 存儲滿足瀏覽器版本號的驅動下標matching_indices = []chromedriver_download_url = []try:h2_div_list = tree.xpath('.//h2[@class="h3"]/text()')for index,h2_item in enumerate(h2_div_list):chromedriver_version = h2_itemmatch_version = re.search(r'\((\d+\.\d+\.\d+\.\d+)\)', chromedriver_version)if match_version:chromedriver_version = match_version.group(1)  # 獲取匹配到的版本號parts2 = chromedriver_version.split('.')# 比較前三個部分if parts1[:3] == parts2[:3]:matching_indices.append(index)  # 如果滿足條件,將索引添加到結果列表中for index in matching_indices:chromedriver_table = tree.xpath('/html/body//div[@class="row"]//div[@class="manual-article"]/div[@class="article-content"]')[0]target_table = chromedriver_table.xpath(f'./table[{index+1}]')[0]chromedriver_tr_list = target_table.xpath('./tbody/tr')for chromedriver_tr in chromedriver_tr_list:if "chromedriver-win64.zip" in chromedriver_tr.xpath('.//text()')[5]:chromedriver_download_url.append(chromedriver_tr.xpath('.//text()')[5])return chromedriver_download_urlexcept Exception as e:print(f"程序發生了異常:{e}")return Noneelse:print("請求chromedriver下載鏈接頁失敗")

3、解壓到本地指定文件夾

def download_chromedriver(chromedriver_download_url,browser_version):if chromedriver_download_url:for url in chromedriver_download_url:# 指定保存壓縮文件的本地路徑zip_file_path = f"chromedriver{browser_version}-win64.zip"# 指定解壓后的文件夾路徑extract_folder_path = f"chromedriver{browser_version}"try:# 發起請求下載文件headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}response = requests.get(url=url,headers=headers)response.raise_for_status()  # 檢查請求是否成功# 將下載的文件寫入本地with open(zip_file_path, "wb") as file:file.write(response.content)# 創建解壓文件夾(如果不存在)if not os.path.exists(extract_folder_path):os.makedirs(extract_folder_path)# 解壓文件with zipfile.ZipFile(zip_file_path, "r") as zip_ref:zip_ref.extractall(extract_folder_path)# 獲取解壓文件夾的子文件夾subfolders = [f for f in os.listdir(extract_folder_path) ifos.path.isdir(os.path.join(extract_folder_path, f))]# 獲取子文件夾的路徑subfolder_path = os.path.join(extract_folder_path, subfolders[0])# 構造chromedriver.exe的絕對路徑chromedriver_path = os.path.join(subfolder_path, "chromedriver.exe")# 檢查chromedriver.exe文件是否存在if os.path.exists(chromedriver_path):print("chromedriver.exe的絕對路徑為:", chromedriver_path)else:print("子文件夾下沒有找到chromedriver.exe文件")print(f"文件已成功下載并解壓到 {extract_folder_path} 文件夾中,路徑為{chromedriver_path}。")break # 有一個壓縮包下載成功即跳出循環except requests.exceptions.RequestException as e:print(f"下載文件時出錯:{e}")print("請檢查網頁鏈接的合法性,適當重試。")except zipfile.BadZipFile:print("下載的文件不是有效的zip文件。")print("請檢查網頁鏈接的合法性,適當重試。")except Exception as e:print(f"發生錯誤:{e}")

之后將chromedriver_path寫入到項目的配置文件中,提供給使用selenium的腳本讀取。

3.2.2、方法二

使用webdriver_manager,它的核心功能是自動檢測已安裝的瀏覽器版本,并下載匹配的驅動程序。

1、安裝方法

pip install webdriver-manager

2、基本使用

from webdriver_manager.chrome import ChromeDriverManager# 安裝 ChromeDriver
driver_path = ChromeDriverManager().install()print(driver_path)

此時下載的瀏覽器驅動、下載位置均為默認,一般情況下直接在selenium創建driver對象時使用,但是會拖慢程序運行速度。

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver# 自動下載并配置ChromeDriver
driver = webdriver.Chrome(ChromeDriverManager().install())# 使用driver進行測試
driver.get("https://www.baidu.com/")
print(driver.title)
driver.quit()

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

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

相關文章

java從azure中讀取用戶信息

以下是用 Java 從 Azure AD 獲取用戶信息的完整實現方案&#xff0c;使用 Spring Boot 框架和 Microsoft 身份驗證庫 (MSAL)&#xff1a; 1. 添加 Maven 依賴 <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.…

C# 數據庫訪問與ORM框架全面指南:從ADO.NET到Entity Framework Core

在現代應用開發中&#xff0c;數據持久化是核心需求之一。作為.NET生態系統中的主力語言&#xff0c;C#提供了豐富多樣的數據庫訪問技術和工具。本文將全面探討C#中的數據庫訪問方式&#xff0c;重點介紹三種主流ORM&#xff08;對象關系映射&#xff09;框架&#xff1a;Entit…

day19 leetcode-hot100-37(二叉樹2)

104. 二叉樹的最大深度 - 力扣&#xff08;LeetCode&#xff09; 1.深度優先遍歷&#xff08;遞歸&#xff09;ps:不好理解&#xff0c;所以我一般不喜歡用遞歸 思路 典型算法&#xff0c;用遞歸求出高度&#xff0c;每次都是深度優先。 具體算法 /*** Definition for a bi…

【LLMs篇】13:LLaDA—大型語言擴散模型

欄目內容論文標題大型語言擴散模型 (Large Language Diffusion Models)核心思想提出LLaDA&#xff0c;一種基于擴散模型的LLM&#xff0c;通過前向掩碼和反向預測過程建模語言分布&#xff0c;挑戰自回歸模型&#xff08;ARM&#xff09;在LLM領域的主導地位&#xff0c;并展示…

Deepfashion2 數據集使用筆記

目錄 數據類別: 篩選類別數據: 驗證篩選前2個類別: Deepfashion2 的解壓碼 數據類別: 類別含義: Class idx類別名稱英文名稱0短上衣short sleeve top1長上衣long sleeve top2短外套short sleeve outwear3長外套long sleeve outwear4裙子skirt5褲子trousers6連衣裙dre…

Java并發編程哲學系列匯總

文章目錄 并發編程基礎并發編程進階并發編程實踐 并發編程基礎 Java并發編程基礎小結 Java線程池知識點小結 詳解JUC包下各種鎖的使用 并發編程利器Java CAS原子類全解 深入理解Java中的final關鍵字 Java并發容器深入解析&#xff1a;HashMap與ArrayList線程安全問題及解…

git 之 stash

一、git stash&#xff1a;臨時保存工作區修改 作用 將當前工作目錄和暫存區的未提交修改保存到棧中&#xff0c;并恢復工作區到上一次提交的干凈狀態。 適用場景&#xff1a; 臨時切換分支修復緊急 Bug拉取遠程代碼前清理工作區保存實驗性代碼避免生成無效提交 常用命令&am…

vxe-grid 雙擊行,打開expand的內容

1、官網api Vxe Table v4.6&#xff08;根據版本&#xff09; 要調用這個事件&#xff0c;雙擊單元格&#xff0c;我們打開type"expand"的內容 2、打開的事件toggleRowExpand 3、事件的說明 這個方法&#xff0c;會自動判斷當前展開的狀態&#xff0c;然后去觸發相…

Java Stream 高級實戰:并行流、自定義收集器與性能優化

一、并行流深度實戰&#xff1a;大規模數據處理的性能突破 1.1 并行流的核心應用場景 在電商用戶行為分析場景中&#xff0c;需要對百萬級用戶日志數據進行實時統計。例如&#xff0c;計算某時段內活躍用戶數&#xff08;訪問次數≥3次的用戶&#xff09;&#xff0c;傳統循環…

計算機系統結構-第5章-監聽式協議

監聽式協議******&#xff1a; 思想: 每個Cache除了包含物理存儲器中塊的數據拷貝之外&#xff0c;也保存著各個塊的共享狀態信息。 Cache通常連在共享存儲器的總線上&#xff0c;當某個Cache需要訪問存儲器時&#xff0c;它會把請求放到總線上廣播出去&#xff0c;其他各個C…

(c++)string的模擬實現

目錄 1.構造函數 2.析構函數 3.擴容 1.reserve(擴容不初始化) 2.resize(擴容加初始化) 4.push_back 5.append 6. 運算符重載 1.一個字符 2.一個字符串 7 []運算符重載 8.find 1.找一個字符 2.找一個字符串 9.insert 1.插入一個字符 2.插入一個字符串 9.erase 10…

學習筆記(24): 機器學習之數據預處理Pandas和轉換成張量格式[2]

學習筆記(24): 機器學習之數據預處理Pandas和轉換成張量格式[2] 學習機器學習&#xff0c;需要學習如何預處理原始數據&#xff0c;這里用到pandas&#xff0c;將原始數據轉換為張量格式的數據。 學習筆記(23): 機器學習之數據預處理Pandas和轉換成張量格式[1]-CSDN博客 下面…

LeetCode 2297. 跳躍游戲 VIII(中等)

題目描述 給定一個長度為 n 的下標從 0 開始的整數數組 nums。初始位置為下標 0。當 i < j 時&#xff0c;你可以從下標 i 跳轉到下標 j: 對于在 i < k < j 范圍內的所有下標 k 有 nums[i] < nums[j] 和 nums[k] < nums[i] , 或者對于在 i < k < j 范圍…

【前端】緩存相關

本知識頁參考&#xff1a;https://zhuanlan.zhihu.com/p/586060532 1. 概述 1.1 應用場景 靜態資源 場景&#xff1a;圖片、CSS、JS 文件等靜態資源實現&#xff1a;使用 HTTP 緩存控制頭&#xff0c;或者利用 CDN 進行邊緣緩存 數據緩存 場景&#xff1a;請求的返回結果實現…

獵板硬金鍍層厚度:高頻通信領域的性能分水嶺

在 5G 基站、毫米波雷達等高頻場景中&#xff0c;硬金鍍層厚度的選擇直接決定了 PCB 的信號完整性與長期可靠性。獵板硬金工藝&#xff1a; 1.8μm 金層搭配羅杰斯 4350B 基材的解決方案&#xff0c;在 10GHz 頻段實現插入損耗&#xff1c;0.15dB/cm&#xff0c;較常規工藝降低…

第35次CCF計算機軟件能力認證-5-木板切割

原題鏈接&#xff1a; TUOJ 我自己寫的35分正確但嚴重超時的代碼 #include <bits/stdc.h> using namespace std; int main() {int n, m, k;cin >> n >> m >> k;vector<unordered_map<int, int>> mp(2);int y;for (int i 1; i < n; …

【藍橋杯】包子湊數

包子湊數 題目描述 小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有 NN 種蒸籠&#xff0c;其中第 ii 種蒸籠恰好能放 AiAi? 個包子。每種蒸籠都有非常多籠&#xff0c;可以認為是無限籠。 每當有顧客想買 XX 個包子&#xff0c;賣包子的大叔就會迅速選出若干…

pikachu通關教程-目錄遍歷漏洞(../../)

目錄遍歷漏洞也可以叫做信息泄露漏洞、非授權文件包含漏洞等. 原理:目錄遍歷漏洞的原理比較簡單&#xff0c;就是程序在實現上沒有充分過濾用戶輸入的../之類的目錄跳轉符&#xff0c;導致惡意用戶可以通過提交目錄跳轉來遍歷服務器上的任意文件。 這里的目錄跳轉符可以是../…

[概率論基本概念4]什么是無偏估計

關鍵詞&#xff1a;Unbiased Estimation 一、說明 對于無偏和有偏估計&#xff0c;需要了解其敘事背景&#xff0c;是指整體和抽樣的關系&#xff0c;也就是說整體的敘事是從理論角度的&#xff0c;而估計器原理是從實踐角度說事&#xff1b;為了表明概率理論&#xff08;不可…

面試題——計算機網絡:HTTP和HTTPS的區別?

HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a;作為互聯網上應用最廣泛的網絡通信協議&#xff0c;HTTP是基于TCP/IP協議族的應用層協議。它采用標準的請求-響應模式進行通信&#xff0c;通過簡潔的報文格式&#xff08;包含請求行、請求頭、請求體等&a…