Selenium是一個自動化web應用程式測試工具,它可以模拟我們浏覽器,所有的操作就像是我們自己真實在操作一樣,使用selenium我們可以模拟登陸、點選等網頁操作,裡面也提供了一些資料抓取的工具,我們可以通過頁面模拟對資料進行抓取;好了廢話不多說,直接一步一步分析:
安裝selenium:
- pip install selenium 不知道是不是我淩晨安裝的原因,估計伺服器在維護,一直下載下傳不下來,白天就好了,但是速度是真的慢
- 注意:如果需要用谷歌浏覽器模拟的話,還需要安裝谷歌浏覽器的驅動,将驅動複制到python根目錄下即可(同理,需要用什麼浏覽器模拟就要裝對應的驅動,同時也需要注意版本)
- 谷歌浏覽器驅動下載下傳:http://npm.taobao.org/mirrors/chromedriver/
- 火狐浏覽器驅動下載下傳:http://ftp.mozilla.org/pub/firefox/releases/
我們先模拟通路百度頁面看看:
from selenium import webdriver # 導入庫
driver = webdriver.Chrome() # 建立一個谷歌浏覽器對象
driver.get('http://www.baidu.com') # 向浏覽器發出通路請求
現在頁面打開了,我們想搜尋東西,改怎麼辦呢?
-
首先我們得在輸入框中輸入我們想要搜尋的關鍵字
想要在搜尋框裡面輸入文本,那麼就需要先找到這個文本框
我們發現這個輸入框的 id=“kw”,那麼我們通過這個就可以找到這個輸入框了
但是我們現在隻是找到了這個輸入框,又需要怎麼向這個輸入框裡面輸入文本呢?driver.find_element_by_id('kw') # 在頁面中查找id為“kw”的控件
driver.find_element_by_id('kw').send_keys('python') # send_keys()鍵入關鍵字
-
然後我們點選“百度一下”這個按鈕實作搜尋功能
同樣的道理,我們搜尋按鈕的id,先找到這個控件,然後通過單擊事件模拟點選搜尋
driver.find_element_by_id('su').click() # 搜尋“百度一下”按鈕,并單擊
ok,這是我們最簡單的一個應用,現在總結下:
- 首先我們想要模拟通路頁面,得先指定浏覽器,建立一個浏覽器對象
- 然後就需要輸入我們想要搜尋的網址
- 後面就是要搜尋定位,找到我們需要控制的,或者需要進行操作的控件在哪裡
- 找到控件,我們就可以進行鍵入、點選、資料分析提取等操作了
那麼,建立浏覽器對象和搜尋網頁這兩步應該不用多說了,接下來我們着重對定位方式來講解一下:
通過上圖我們可知提供了八種定位的方式給我們,那麼他們分别是什麼意思呢?我們通過實踐來了解一下:
上圖就是我們剛才輸入框的相關源碼,我們發現這裡面有幾個屬性,我們發現跟我們八種方法比對,id、name和class是有的,簡單明了,我們看下使用方法,其實達到的效果都是一樣的,但是需要注意的,屬性和值一定需要在這個頁面是唯一的:
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_name('wd').send_keys('python')
driver.find_element_by_class_name('s_ipt').send_keys('python')
我們發現最上面有幾個連結,可以到百度新聞、hao123等地方,如果我們想通過單擊通路hao123該怎麼辦呢?
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_link_text('hao123').click() # 根據完整的超連結對應文本定位
driver.find_element_by_partial_link_text('hao').click() # 根據部分超連結文本定位
我們發現點選百度首頁的logo,連結到的是搜尋今日新鮮事,那我們來模拟一下點選logo跳轉到今日新鮮事:
我們發現這個logo的标簽是map,非常特别,搜尋了一下:
發現隻有一個,那麼我們可以直接用标簽名字來進行定位:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_tag_name('map').click()
在我們頁面中,可能會有很多名字相同的标簽,那麼這樣查找出來的結果就會非常多,那麼單獨使用的意義也就不大了,可以通過和其他的方法聯合使用,先縮小範圍,然後再用标簽定位;
接下來我們就用XPath進行定位,或者說縮小範圍:
還是這個輸入框,我們先用XPath直接進行定位,實作輸入關鍵字的效果
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_xpath("//input[@id='kw']").send_keys('python')
我們最後來總結一下:
元素定位的八種方法
方法 說明 find_element_by_id() 通過屬性id進行定位 find_element_by_name() 通過屬性name進行定位 find_element_by_class_name() 通過class名進行定位 find_element_by_link_text() 通過完整的超連結對應文本進行定位 find_element_by_partial_link_text() 通過部分超連結對應文本進行定位 find_element_by_tag_name() 通過标簽進行定位 find_element_by_xpath() 通過xpath進行定位 find_element_by_css_selector() 通過css選擇器進行定位(這裡先不講)
幾種常見的浏覽器控制方法
方法 說明 set_window_size() 設定浏覽器大小 back() 頁面後退 forward() 頁面前進 refresh() 頁面重新整理
clear()
清除文本 close() 關閉單個視窗 quit() 關閉所有視窗 send_keys(字元串) 模拟按鍵輸入 click() 單擊 save_screenshot(儲存路徑) 儲存螢幕截圖 submit() 送出表單 get_attribute(屬性名稱) 擷取屬性值 text 擷取元素文本 size 擷取元素大小 rect 擷取元素的大小和位置資訊