人生苦短,我用 Pythonhtml
前文傳送門:前端
小白學 Python 爬蟲(1):開篇python
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝git
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門github
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門web
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎chrome
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝數據庫
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
小白學 Python 爬蟲(17):Requests 基礎使用
小白學 Python 爬蟲(18):Requests 進階操做
小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)
小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)
小白學 Python 爬蟲(23):解析庫 pyquery 入門
小白學 Python 爬蟲(26):爲啥買不起上海二手房你都買不起
小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(一)
在介紹交互以前,咱們先簡單瞭解一下新名詞:AJAX 。
AJAX 全寫爲 「Asynchronous Javascript And XML」 (異步 JavaScript 和 XML),是指一種建立交互式網頁應用的網頁開發技術。
AJAX 是一種在無需從新加載整個網頁的狀況下,可以更新部分網頁的技術。
重點來了,咱們若是在網站中使用 AJAX ,能夠在整個網頁不刷新的狀況下,更夠更新網頁上的顯示信息(DOM 節點),也就是 DOM 節點,這種技術被普遍的應用到各個網站之中,最開始的時候,你們都只是使用它更新部分的網頁,也不知道是哪位大佬異想天開:既然 AJAX 能夠更新部分網頁,那麼能不能用它來更新所有網頁呢?這就產生了現代的前端框架:React 、 Vue 和 Angular。
這種思想,如今被更加普遍的應用於各大網站之中,由於這種方式,前端頁面上只有最基礎的 DOM 節點,其他全部的 DOM 節點都是由 JavaScript 動態渲染出來的,而 JavaScript 都是通過打包處理的,可讀性極差。
那麼爲何要選用前端框架呢? HTML + CSS + JQuery 就不行麼?
固然不是,其實之因此如今咱們須要選擇框架,本質上是由於咱們面臨的需求變了。你們確定都明白若是咱們只寫一個純展現信息的頁面,沒有任何交互功能的頁面,其實即使是如今,咱們也是不須要選擇框架的,咱們只須要寫幾行 CSS 和 HTML 就能夠完成任務。
因此是由於咱們面臨的需求變得複雜了,咱們的應用常常須要在運行時作一些交互。
現代的前端開發,咱們開發的應用常常須要在運行時來作一些交互,這些交互在早期只是個幻燈片或者 Tab 切換下拉菜單等一些簡單的交互,這些交互用 JQuery 實現徹底沒什麼問題。但現代的前端咱們的目標是用 Web 去 PK 原生應用,去和 Native 進行 PK 。
emmmmmmmmm,聊偏了,下面咱們接着聊 Selenium 。
現在,大多數 Web 應用程序都在使用 AJAX 技術。當瀏覽器加載頁面時,該頁面中的元素可能會以不一樣的時間間隔加載。這使定位元素變得困難:若是 DOM 中尚不存在元素,則定位函數將引起 ElementNotVisibleException 異常。使用等待,咱們能夠解決此問題。等待在執行的動做之間提供了必定的鬆弛時間-主要是定位元素或對該元素進行的任何其餘操做。
Selenium Webdriver 提供兩種類型的等待-隱式和顯式。顯式等待使 WebDriver 等待特定條件發生,而後再繼續執行。隱式等待使 WebDriver 在嘗試查找元素時輪詢DOM必定時間。
咱們可使用 time.sleep()
來設定等待時間,徹底沒有問題,可是它須要將條件設置爲要等待的確切時間段。若是咱們不知道準確的渲染時間,咱們就沒法設定一個比較合適的值。
Selenium 爲咱們提供了 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 EC driver = webdriver.Chrome() driver.get("https://www.jd.com/") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "key")) ) finally: driver.quit()
結果以下:
<selenium.webdriver.remote.webelement.WebElement (session="b1baacca997d18d7d54447127c844d15", element="a472369e-3196-4456-b43e-4e1b280bf5b9")>
上面咱們使用了 WebDriverWait 來設置最長等待時間,這裏咱們選擇獲取 JD 首頁的輸入框,咱們限定的等待時間爲 10s ,若是它在 10s 內都沒法返回結果,將會拋出 TimeoutException 。默認狀況下, WebDriverWait 每 500 毫秒調用 ExpectedCondition ,直到成功返回。
隱式等待告訴 WebDriver 在嘗試查找不當即可用的一個或多個元素時在必定時間內輪詢 DOM 。默認設置爲 0 。設置後,將在 WebDriver 對象的生存期內設置隱式等待。
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("https://www.jd.com/") key = driver.find_element_by_id("key") print(key)
Selenium 爲咱們提供了一些節點的交互動做,如輸入文字時能夠用 send_keys()
方法,清空文字時能夠用 clear()
方法,點擊按鈕時能夠用 click()
方法。
from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('https://www.taobao.com/') input = driver.find_element_by_id('q') input.send_keys('IPad') time.sleep(1) input.clear() input.send_keys('Surface Pro') button = driver.find_element_by_class_name('btn-search') button.click()
在上面這個示例中,咱們先打開淘寶網,而且開啓了隱式等待,先在搜索框中輸入了 IPad ,在等待 1s 後刪除,再輸入了 Surface Pro ,而後點擊了搜索按鈕,先在淘寶搜索須要用戶登陸才能搜索,因此咱們直接跳轉到了登陸頁。
對於某些 Selenium API 沒有提供的操做,咱們能夠經過模擬運行 JavaScript 的方式來完成,用到的方法是 execute_script()
,好比咱們在淘寶首頁將滾動條滑到底部:
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.taobao.com/') driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
前面咱們介紹瞭如何拿到 DOM 節點,那麼最重要的是咱們要從 DOM 節點上來獲取咱們須要的信息。
由於咱們獲取的是 WebElement 類型,而 WebElement 也提供了相關的方法來提取節點信息。
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 實例化一個啓動參數對象 chrome_options = Options() # 設置瀏覽器窗口大小 chrome_options.add_argument('--window-size=1366, 768') # 啓動瀏覽器 driver = webdriver.Chrome(chrome_options=chrome_options) url = 'https://www.geekdigging.com/' driver.get(url) title = driver.find_element_by_xpath('//*[@id="text-4"]/div/div/div[1]/div[2]/a') print(title) # 獲取屬性信息 print(title.get_attribute('href')) # 獲取文本信息 print(title.text) # 獲取位置 print(title.location) # 獲取大小 print(title.size)
上面由於 Chrome 默認打開大小有點小,打開小編博客的時候小編選擇的這個 DOM 節點正好看到,因此小編設置了一下 Chrome 瀏覽器打開時的大小。
具體信息的提取小編列出了一部分,都加好註釋了,還有一部分比較有意思的屬性小編列在下面,供你們參考:
最後這兩個獲取元素屏幕快照,在獲取驗證碼的時候將驗證碼截取出來會很好用的。
咱們使用瀏覽器最上面的地方有一個前進和後退按鈕,Selenium 完成這兩個動做使用了 back()
和 forward()
這兩個方法。
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') browser.get('https://www.taobao.com/') browser.get('https://www.geekdigging.com/') browser.back() time.sleep(1) browser.forward()
這個各位同窗應該都看的懂,小編就很少囉嗦了。
又到了一個重點內容, Cookies ,它是和服務端保持會話的一個重要元素。 Selenium 爲咱們提供了一些方法,讓咱們能夠方便的對 Cookies 進行增刪改查等操做。示例以下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.geekdigging.com/') # 獲取 cookies print(browser.get_cookies()) # 添加一個 cookie browser.add_cookie({'name': 'name', 'domain': 'www.geekdigging.com', 'value': 'geekdigging'}) print(browser.get_cookies()) # 刪除全部 cookie browser.delete_all_cookies() print(browser.get_cookies())
Selenium 的簡單介紹就到這裏了,但願各位同窗看完後能本身動手試一試,畢竟並不難。
本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。
https://blog.csdn.net/caoxuecheng001/article/details/81290643
https://www.jianshu.com/p/02af89375b54
https://cuiqingcai.com/5630.html
原文出處:https://www.cnblogs.com/babycomeon/p/12105449.html