我在搞爬取的時候,發現有些網站直接用driver.get(url)
跳轉到目標特定的網址的時候,會被強制跳轉到其他的網址上,但是如果是自己手動,在網址欄那里輸入網址,并點回車,卻能完成跳轉。
這是在使用 Selenium 進行自動化測試或爬蟲時,driver.get(url)
和 手動輸入網址并回車/點擊 在操作流程上有本質區別,主要體現在 瀏覽器行為、觸發事件、性能及穩定性 等方面。
以下是詳細對比:
1. driver.get(url)
的原理與特點
- 直接導航:
Selenium 通過瀏覽器驅動(如ChromeDriver)直接向瀏覽器發送導航命令,跳過地址欄輸入,類似代碼層面的window.location.href = url
。 - 不觸發頁面加載事件:
部分瀏覽器可能不會完全模擬手動輸入時的完整生命周期事件(如beforeunload
)。 - 速度快:
無需模擬鍵盤輸入和回車操作,直接加載目標頁面。 - 無地址欄歷史記錄(部分瀏覽器):
某些情況下,瀏覽器地址欄的歷史記錄可能不會更新(取決于驅動實現)。
示例代碼:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com") # 直接導航
2. 手動輸入網址并回車/點擊的特點
- 完整模擬用戶行為:
- 聚焦地址欄 → 2. 輸入字符 → 3. 回車或點擊“前往”按鈕。
- 觸發完整事件鏈:
包括keydown/keyup
、change
、submit
等事件,可能影響頁面加載邏輯(尤其是依賴地址欄監聽的網站)。 - 性能較慢:
需要逐字符輸入,受鍵盤延遲影響。 - 歷史記錄可靠:
地址欄歷史記錄一定會更新。
3. 關鍵差異對比
對比項 | driver.get(url) | 手動輸入網址+回車/點擊 |
---|---|---|
觸發事件 | 僅觸發基本導航事件 | 觸發完整鍵盤/地址欄事件鏈 |
速度 | 快(直接跳轉) | 慢(需模擬輸入和回車) |
瀏覽器歷史記錄 | 可能不更新(因驅動實現而異) | 一定更新 |
兼容性 | 所有網站通用 | 需定位地址欄元素(可能因瀏覽器而異) |
適用場景 | 常規爬蟲/測試 | 測試地址欄相關功能(如輸入建議) |
4. 解決方法
-
4.1 優先使用
driver.get(url)
:如果是經常需要連接某個網站的話,就時不時清空頁面吧。
driver.get("about:blank") # 先清空頁面 # 再手動輸入網址(確保歷史記錄生成)
-
4.2 手動輸入場景:
如果driver.get(url)
搞不定,可能存在下面的原因:- 測試地址欄的輸入提示、歷史記錄功能。
- 某些網站通過JavaScript監聽地址欄輸入(罕見)。
- 某些動態網站單頁應用(SPA)依賴
hashchange
或popstate
事件
這個時候可以采用JavaScript 執行導航 :
from selenium import webdriver
import time# 初始化 WebDriver(以 Chrome 為例)
driver = webdriver.Chrome()# 使用 JavaScript 執行導航
driver.execute_script("window.location.href = 'https://www.example.com';")# 等待頁面加載(根據需要可以添加顯式等待)
time.sleep(5)# 關閉瀏覽器
driver.quit()
PS:
由于瀏覽器的地址欄無法通過常規的 HTML 元素來定位,如標簽名、CSS 選擇器等來操作。
所以使用selenium的find_element ,是沒有辦法直接定位到網址欄,這種操作是不太可行的。
錯誤的演示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time# 初始化 WebDriver(以 Chrome 為例)
driver = webdriver.Chrome()# 找到地址欄(通常可以通過標簽名或特定的 CSS 選擇器定位)
address_bar = driver.find_element_by_tag_name("input") #在這里,chrome是無法對地址欄做定位的# 清空地址欄(可選,確保地址欄為空)
address_bar.clear()# 輸入網址
address_bar.send_keys("https://www.example.com")# 模擬按下回車鍵
address_bar.send_keys(Keys.RETURN)# 等待頁面加載(根據需要可以添加顯式等待)
time.sleep(5)# 關閉瀏覽器
driver.quit()
這是因為地址欄是瀏覽器的一部分,而不是網頁內容的一部分。
因此,Selenium 無法直接與地址欄交互。
如果需要更多繞開檢測的方法,可以參考這個文章:Selenium模擬人類行為,操作網頁的方法(全)