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 獲取元素的大小和位置信息