selenium教程
環境: Python3.6.5
編譯器: Sublime Text 3
聯系方式: ke.zb@qq.com
第三方庫: selenium
文章目錄
- 一、簡介
- 二、安裝
- 三、下載驅動器
- 四、簡單實例
- 五、配置瀏覽器
- (一)配置瀏覽器
- (二)添加代理
- 六、定位標簽
- 七、頁面操作
- 八、等待頁面加載
- (一)顯示等待
- (二)隱式等待
- 九、后記
一、簡介
我們模擬登陸用的是selenium庫,selenium是一個自動化測試工具,在爬蟲中通常用來進行模擬登陸。它支持各種瀏覽器,包括 Chrome,Safari,Firefox 等主流界面式瀏覽器,同時Selenium也支持多種語言開發,比如 Java,C,Ruby、Python等等。
二、安裝
這里我推薦給大家的安裝工具是命令行,win+R輸入cmd可以快速打開命令行工具
在命令行中輸入以下命令即可安裝,前提是你已經安裝好Python環境且pip可以正常使用
pip install selenuim三、下載驅動器
驅動器是我們在通過selenium模擬用戶操作時需要的一個工具,我這里用的是Chromedriver(谷歌瀏覽器驅動,對應谷歌瀏覽器),下面是Chrome、Firefox、Safari等瀏覽器驅動的下載地址
【Chrome驅動下載地址】
【Firefox驅動下載地址】
【Safari驅動下載地址】
下載完成后我們有兩種掉用驅動器的方法,一種是把驅動器放到py文件同一文件夾下,另外一種就是將驅動器放到Python的安裝目錄下,以下是我的Python安裝目錄
注:網上流傳比較廣的方法是將驅動器加到環境變量中,但是我試了好像不怎么管用依然會報錯,所以我就不放到這里(實踐過確實有效的童鞋,可以在文章下方留言,在此感謝你的分享)
四、簡單實例
來一段代碼讓我們直觀的理解一下selenium吧
from selenium import webdriverdriver = webdriver.Chrome() driver.get('http://www.baidu.com/')運行代碼,我們可以看到跳出如下的瀏覽器界面
下面我們將繼續完善代碼來實現自動化,在搜索框中輸入“明天依舊可好”–>點擊搜索結果的第一條
time.sleep(1) driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依舊可好") time.sleep(2) driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()五、配置瀏覽器
我們在使用 selenium 時,可能需要對 chrome 做一些特殊的設置,以完成我們期望的瀏覽器行為,比如最大化窗口,無窗口啟動 等動作。這些需要selenium的ChromeOptions來幫助我們完成
(一)配置瀏覽器
chromeoptions 是一個方便控制 chrome 啟動時屬性的類,主要提供如下的功能:
- 設置 chrome 二進制文件位置 (binary_location)
- 添加啟動參數 (add_argument)
- 添加擴展應用 (add_extension, add_encoded_extension)
- 添加實驗性質的設置參數 (add_experimental_option)
- 設置調試器地址 (debugger_address)
常用設置舉例:
#設置無窗口 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') driver = webdriver.Chrome(chrome_options=options) driver.get('https://blog.csdn.net/qq_38251616')1.add_argument常用系列
- 無窗口:- -headless
- 啟動就最大化:- -start-maximized
- 設置窗口大小:- -window-size=100,100
- 禁用彈出攔截:- -disable-popup-blocking
- 禁用插件:- -disable-plugins
- 禁用圖像:- -disable-images
- 偽裝iphone登錄:- -user-agent=iphone
- 偽裝android:- -user-agent=android
- 設置語言為簡體中文:- -lang=zh-CN
- 使用給定的 User-Agent 字符串:- -user-agent=“這里填寫User-Agent”
- 禁用Javascript:- -disable-javascript
- 指定用戶文件夾User Data路徑:- -user-data-dir="[PATH]"
注釋:兩個“-”中間是沒有空格的,由于排版原因我在中間加了一個空格。
(二)添加代理
chrome_options = webdriver.ChromeOptions() #設置代理 chrome_options.add_argument('--proxy-server=http://{ip}:{port}') driver = webdriver.Chrome(chrome_options=options) driver.get('https://blog.csdn.net/qq_38251616')六、定位標簽
定位方法示例:
#獲取網頁中的h1標簽 h1 = driver.find_element_by_name("h1") #獲取網頁中所有的h1標簽 h1_list = driver.find_elements_by_name("h1")單個元素選取:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
多個元素選取:
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
七、頁面操作
selenium最主要的優勢在于我們可以在代碼中添加需要對網頁進行的操作,比如輸入提交表單、點擊按鈕、清空輸入框等等。下面我將常用的操作一一列舉出來
1.點擊
driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()2.輸入文本
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依舊可好")3.清空輸入框
driver.find_element_by_xpath("//input[@name='wd']").clear()4.關閉瀏覽器
driver.close()5.拖放
element = driver.find_element_by_name("source") target = driver.find_element_by_name("target")from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform()6.切換窗口
窗口之間的切換是通過句柄的切換來完成的,每一個窗口對應著一個句柄(類似于ID)
window_handles用于獲取已經打開的所有窗口的句柄,返回列表;current_window_handle用戶獲取當前窗口的句柄,返回字符串。
八、等待頁面加載
(一)顯示等待
顯式等待是你在代碼中定義等待一定條件發生后再進一步執行你的代碼。 最糟糕的案例是使用time.sleep(),它將條件設置為等待一個確切的時間段。 下面有一些方便的方法讓你只等待需要的時間。WebDriverWait結合ExpectedCondition 是實現的一種方式。
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 ECtry:element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//input[@name='wd']"))) finally:print("網頁加載完成")上面的代碼最多等待 10 秒,超時后就拋出 TimeoutException,假設在第4秒就找到了這個元素,那么也就不會多等剩下的6秒使時間,而是繼續執行后續代碼。WebDriverWait 默認每 500 毫秒調用一次 ExpectedCondition 中的方法,直到它返回成功信號,如果成功,則返回相應的內容,否則返回布爾類型的 False。
我這個是通過Xpath規則//input[@name='wd']來判斷頁面是否渲染完成,當然你也可以換成其他的判斷條件。我給出如下模板,
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 ECtry:element = WebDriverWait(driver, 等待時間范圍).until( EC.實現條件((By.定位方式, 定位值))) finally:print("網頁加載完成")(二)隱式等待
隱式等待是在嘗試發現某個元素的時候,如果沒能立刻發現,就等待固定長度的時間。默認設置是0秒。一旦設置了隱式等待時間,它的作用范圍就是Webdriver對象實例的整個生命周期。
from selenium import webdriverdriver = webdriver.Chrome(chrome_options=chrome_options) driver.implicitly_wait(10)driver.get('http://www.baidu.com/') driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依舊可好")九、后記
關于selenium實戰項目請參考:【實現CSDN自動點贊】、【爬取QQ群中的人員信息】
我的專欄:【機器學習100天】、【K童鞋的爬蟲筆記】
參考文章:selenium 定制啟動 chrome 的選項、selenium+python配置chrome瀏覽器的選項、selenium 的顯示等待與隱式等待、selenium-Python中文文檔、Selenium中的“顯示等待”和“隱式等待”
如果覺得我寫得可以點個贊唄;如果有什么不足的地方,還你希望可以在下方留言告訴我。
總結
以上是生活随笔為你收集整理的selenium教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitBook入手
- 下一篇: 一、简谈Pandas