????????在使用selenium進行web自動化或爬蟲的時候,經常會面臨登錄的情況,對于這種情況,我們可以利用Selenium控制已經打開的瀏覽器,從而避免每次都需要重新打開瀏覽器并進行登錄的繁瑣步驟。????
目錄
說明
啟動瀏覽器
?注意
--user-data-dir說明
?代碼設定
代碼
改進代碼
效果
直接使用webdriver
使用指定端口打開的瀏覽器
說明
????
說明
????????這里已打開的瀏覽器不是指我們在桌面雙擊打開的瀏覽器,而是指我們在命令行中指定端口號啟動的瀏覽器,直接控制我們先前桌面雙擊打開的瀏覽器內的網頁不可行(已驗證)。
啟動瀏覽器
啟動瀏覽器時,我們需要使用CMD命令行來使瀏覽器在指定端口啟動
start chrome --remote-debugging-port=9222
#或者
start chrome --remote-debugging-port=9222 --user-data-dir='一個空文件夾的路徑'#說明
#其余端口也可以,只要沒被占用過就行
#--user-data-dir非必須
在9222端口啟動chrome瀏覽器?
start msedge --remote-debugging-port=9222
#或者
start msedge --remote-debugging-port=9222 --user-data-dir='一個空文件夾的路徑'#說明
#其余端口也可以,只要沒被占用過就行
#--user-data-dir非必須
在9222端口啟動Edge瀏覽器
?注意
1.上述命令行啟動的瀏覽器和我們直接在桌面上雙擊瀏覽器圖標啟動的瀏覽器沒有任何差別,只是在我們設定的端口號運行而已。
? ? ? ? ? ?通過CMD命令(不加--user-data-dir)啟動的chrome瀏覽器
--user-data-dir說明
--user-data-dir用來指定從命令行啟動的瀏覽器的用戶數據路徑,以chrome瀏覽器為例,
????????不加--user-data-dir的話,我們每一次從該端口啟動的chrome瀏覽器的用戶數據將直接來源于本機上的原本的chrome瀏覽器內的用戶數據
start chrome --remote-debugging-port=9222
????????加上--user-data-dir的話,我們第一次運行下方的CMD命令將會發現:
start chrome --remote-debugging-port=9222 --user-data-dir='一個文件夾的路徑'
????????從該端口啟動的chrome瀏覽器將和初始化的chrome瀏覽器一樣,沒有任何用戶數據,也將沒有收藏書簽頁。
????????這是因為指定的路徑下userdata數據為空,不過在這一次設定好之后,我們再使用上方的CMD命令,每次打開的chrome瀏覽器又會和第一次設定的一致,因為我們每次啟動的chrome瀏覽器的用戶數據都不再為空。
?通過CMD命令(加--user-data-dir)啟動的chrome瀏覽器
?代碼設定
????????我們使用CMD命令啟動了指定端口的瀏覽器后,接下來要做的就是在代碼中設定并與其連接,
連接之后,其余操作與我們正常使用webdriver一致。
代碼
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
port=9222
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('url')
#
#
#其余操作邏輯
?Chrome瀏覽器連接已在9222端口打開的瀏覽器
from selenium import webdriver
from selenium.webdriver.edge.options import Options
port=9222
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Edge(options=chrome_options)
browser.get('url')
#
#
#其余操作邏輯
??Edge瀏覽器連接已在9222端口打開的瀏覽器
????????上述代碼運行后便會連接到指定端口打開過的對應的瀏覽器,但是考慮到需要手動打開CMD輸入命令比較麻煩,我們可以使用OS庫在代碼中直接執行前邊提到的CMD命令。
????????于是便有了下邊的改進后的代碼。
改進代碼
#打開已經打開過的谷歌瀏覽器
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsimport os
def open_chrome(port:int=9222,user_data_dir:str=None):cmd_line=f'start chrome --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=None
open_chrome(port=port,user_data_dir=user_data_dir)
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('url')
#
#
#
打開指定端口打開過的Chrome瀏覽器
#打開指定端口打開過的Edge瀏覽器
from selenium import webdriver
from selenium.webdriver.edge.options import Optionsimport os
def open_edge(port:int=9222,user_data_dir:str=None):cmd_line=f'start msedge --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=r"E:\OneDrive\Desktop\Edgedata"
open_edge(port=port,user_data_dir=user_data_dir)
edge_options=Options()
edge_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Edge(options=edge_options)
browser.get('url')
#
#
#
?打開指定端口打開過的Edge瀏覽器
效果
????????這里我們以打開小紅書并在搜索框內搜索指定內容為例。
直接使用webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium .webdriver.chrome.options import Options
from selenium import webdriver
chrome_options=Options()
chrome_options.add_experimental_option('detach',True)#確保webdriver不會任務完成關閉
browser=webdriver.Chrome(options=chrome_options)
browser.get('https://www.xiaohongshu.com/explore')
browser.maximize_window()
browser.implicitly_wait(10)
search_bar=browser.find_element(By.XPATH,'//*[@id="search-input"]')
browser.execute_script('arguments[0].click()',search_bar)
search_bar.send_keys('哪吒2之魔童鬧海')
search_bar.send_keys(Keys.ENTER)
?結果
????????直接使用webdriver打開有彈窗,且還需要傳入很多options參數來免除自動化痕跡,面對這種情況我們通常是在代碼內加一個手動掃碼登錄的機制,但是這樣比較麻煩,尤其是代碼需要反復調試時,每次運行代碼都需要手動掃碼進行登錄,次數太多還有可能被封IP。?
使用指定端口打開的瀏覽器
????????為了更方便,我們在CMD命令中不使用--user-data-dir參數,這樣打開的瀏覽器的userdata包括各個網站的cookie數據都與先前的瀏覽器一致,唯一區別就是端口號不一致。
????????首先,雙擊打開桌面的Chrome瀏覽器,并掃碼登錄小紅書。
已經登錄了的小紅書?
????????接著,關掉打開的Chrome瀏覽器,直接運行下方代碼?
#打開指定端口打開過的Chrome瀏覽器
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriverimport os
def open_chrome(port:int=9222,user_data_dir:str=None):cmd_line=f'start chrome --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=None
open_chrome(port=port,user_data_dir=user_data_dir)
chrome_options=Options()
chrome_options.add_experimental_option('debuggerAddress',f'127.0.0.1:{port}')
browser=webdriver.Chrome(options=chrome_options)
browser.get('https://www.xiaohongshu.com/explore')
browser.maximize_window()
browser.implicitly_wait(10)
search_bar=browser.find_element(By.XPATH,'//*[@id="search-input"]')
browser.execute_script('arguments[0].click()',search_bar)
search_bar.send_keys('哪吒2之魔童鬧海')
search_bar.send_keys(Keys.ENTER)
??運行結果
???????可以看到,我們在options選項中并沒有指定任何消除自動化控制痕跡的argument然而左上角卻沒有受到自動測試軟件控制字樣的infobar,并且一打開網頁便是登錄狀態,這說明我們啟動的不是webdriver而是已經連接到的Chrome瀏覽器。
說明
? ? ? ?1. Edge瀏覽器的連接方法與上文案例中所示的Chrome瀏覽器連接方法一致,只不過,作者本人電腦上在測試時總是需要在CMD命令中指定--user-data-dir參數才可以正常運行,即使這樣也沒關系,你可以先運行open_edge()函數,然后打開新的edge后點擊一鍵導入數據然后之后正常使用即可。
import os
def open_edge(port:int=9222,user_data_dir:str=None):cmd_line=f'start msedge --remote-debugging-port={port}'if user_data_dir:cmd_line+=f' --user-data-dir={user_data_dir}'os.popen(cmd_line)port=9222
user_data_dir=r"E:\OneDrive\Desktop\Edgedata"
open_edge(port=port,user_data_dir=user_data_dir)
打開指定端口的edge瀏覽器?
????????點擊是,繼續后就會將原來edge的userdata全部導入的你傳入的文件夾內,之后你每次帶著--user-data-dir=‘文件夾路徑’ 這一參數運行即可。?
????????2.連接到已經打開過的瀏覽器進行自動化的話,除了用來設置連接端口的options,其余options都將失效,即使傳入也不會有任何變化,因為那些options都是給webdriver設置的,我們現在正在操控的是瀏覽器實例!