在無圖形界面Linux里使用selenium進行采集及注意事項


selenium是一款老牌的自動化測試工具,也被不少人用做爬蟲工具。 通常我們使用時都是在Windows或者帶圖形界面的Linux系統下,且需配合ChromeDriver(或其他瀏覽器Driver),但生產環境很多時候是純命令行的Linux環境;其實在這種條件下,selenium也是可以部署使用的,官方提供了供遠程調用的docker實例。

安裝環境

安裝docker環境,此步不再敘述

之后分別pull selenium Grid(可以認為是selenium的一個分布式組件)和Chrome實例(類比分布式系統中的worker節點)

# 或者直接run,docker會自動拉取本地沒有的鏡像
docker run -d -p 4444:4444 --name selenium-hub selenium/hub
docker run -d -P --link selenium-hub:hub -v /dev/shm:/dev/shm selenium/node-chrome

 

注意:官方說明中還指定了一種先 docker network create grid創建一個專用網絡的方法,此法中除了hub要用--net指定網絡外,node-chrome不可以再用--link,即便配合--net也不行,而是要把--link換成設置環境變量

docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome

這點其實可以理解,docker network本來就是設計用來替代--link的。

 

上述命令其實就是建立了一個selenium的分布式集群,有一個調度節點和一個工作節點,工作節點可以繼續用相同命令添加,我們之后交互的只是調度節點。

假設上述容器都運行在本地(即IP為127.0.0.1),則我們的代碼里,做如下修改即可

driver = webdriver.Chrome(executable_path=chromedriver_path)
# 上面是本地運行selenium實例,chromedriver_path是chromedriver.exe程序的路徑。現在改為如下:
driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub")

可以看到,對原工程代碼修改的地方只有一行,改動很少,之后我們的采集/測試程序就可以在純字符界面里工作了。

 

注意事項

雖然修改后的大部分使用方式沒有任何區別,但還有幾點需要注意:

  • chrom_options = webdriver.ChromeOptions() 可以為啟動的瀏覽器實例指定一些參數,兩種模式下寫法有些區別
# 本地運行模式
chrom_options = webdriver.ChromeOptions()
prefs = {
            "profile.managed_default_content_settings.images": 2,
            "profile.managed_default_content_settings.notifications": 2,
            }
chrom_options.add_experimental_option('prefs',prefs)
chrom_options.add_argument('--proxy-server=http://' + "192.168.1.111:8888")
chrom_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(executable_path=chromedriver_path,
                       chrome_options=chrom_options)

# 遠程運行模式
chrom_options = webdriver.ChromeOptions()
prefs = {
            "profile.managed_default_content_settings.images": 2,
            "profile.managed_default_content_settings.notifications": 2,
            }
chrom_options.add_experimental_option('prefs',prefs)
chrom_options.add_argument('--proxy-server=http://' + "192.168.1.111:8888")
chrom_options.add_argument("--disable-gpu")
desired_capabilities = chrom_options.to_capabilities()
driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub",
                            desired_capabilities=desired_capabilities)

 

  • chrom_options.add_argument(r'--user-data-dir=Z:\\UserData\\test1')可以讓瀏覽器加載完整的用戶配置文件,但此參數在Remote模式下無法使用,同理加載擴展程序的chrome_options.add_extension('D:\\crx\\AdBlock_v2.17.crx')也無效。
  • 需要加上--disable-gpu參數,chrom_options.add_argument("--disable-gpu"),否則會報錯。

 

  • driver.quit()同樣會關閉遠程的瀏覽器實例,但如果在driver活躍時,用driver.session_id獲得當前session_id,且使用完后不quit,下次使用此id還可以繼續復用上次未關閉的瀏覽器,相當於遠程瀏覽器實例和打開的窗口都未關閉。
desired_capabilities = chrom_options.to_capabilities()
driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub",
                                       desired_capabilities=desired_capabilities)
driver.quit() # webdriver.Remote會打開一個新瀏覽器,我們要復用舊會話,所以退出這個新的
driver.session_id = sessionid # 現在driver已經是上次程序結束時的driver了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM