在前面爬蟲的相關介紹中,我們介紹瞭如何抓取靜態頁面資訊。但是,在實際的網頁瀏覽過程中,我們可能會經常碰到各種需要進行互動的操作,典型的如輸入資訊、點選按鈕之類。
對於這種場景,之前的靜態頁面操作方式已經不能滿足需求,這時我們需要藉助新的工具,比如selenium或者PhantomJS。由於後者已經停止維護,推薦使用前者。
1.selenium是什麼
如果大家有做過web的自動化測試,相信對於selenium一定不陌生,測試人員經常使用它來進行自動化測試。
selenium最初是一個自動化web測試工具,通過程式碼模擬人使用瀏覽器自動訪問目標站點並操作,比如跳轉、輸入、點選、下拉等。
由於開發者的不斷完善,目前的功能越來越強大,基本支援各種互動操作。同時,不止支援有界瀏覽,還支援無界瀏覽。
2.selenium有什麼用
正如我們前面講過的,爬蟲的本質過程就是模擬人對瀏覽器的操作過程。在爬蟲中使用,selenium主要是為了解決requests無法執行javaScript程式碼的問題。
本質上是通過驅動瀏覽器,完全模擬瀏覽的操作,比如跳轉、輸入、點選、下拉等...進而進行跳轉。
當然,它也有壞處,主要的壞處就是它的速度比較慢。原因是selenium在操作時,需要等瀏覽器對頁面的元素渲染好之後才能操作。而我們知道,由於頁面渲染過程需要載入各種資源,響應速度與網路頻寬要求非常高。通常情況,它比靜態頁面的響應至少慢一個數量級。
3.如何使用selenium
在知道selenium是什麼以及有什麼用之後,我們來具體學習如何操作這個工具。
由於selenium本質是模擬人對瀏覽器進行輸入、選擇、點選等操作,因此對於目標標籤的定位非常重要。
在前面的章節,我們對於如何定位目標標籤有過詳細的介紹,這裡就不再贅述。selenium對於目標標籤定位的方式本質與靜態的頁面一樣,只不過因為使用的包不同,因此在beautifulSoup中使用的是find和findAll,而在selenium中使用的介面有所變化。
下圖中已對各種定位方式進行了歸納總結:
在找到目標標籤之後,最重要的是對這些標籤進行模擬操作。Selenium庫下webdriver模組常用方法主要分類兩類:一類是模擬瀏覽器、鍵盤操作,另一類是模擬滑鼠操作。
3.1模擬瀏覽器、鍵盤操作
模擬瀏覽器、鍵盤操作的方法歸納如下:
3.2 模擬滑鼠操作
模擬滑鼠操作的方法歸納如下:
4.示例演示
在介紹了selenium相關的使用方法之後,我們來進行操作。這裡介紹兩個例子:第一個例子是模擬百度搜尋,第二個例子是模擬自動登入網易163郵箱傳送郵件。
在開始示例之前我們需要安裝selinum外掛包,同時還需要下載webdriver。在我們的示例中,需要是使用chrome瀏覽器進行操作,需要使用瀏覽器的驅動webdriver。
關於下載什麼版本的webdriver,可以在瀏覽器的屬性中檢視,並在http://npm.taobao.org/mirrors/chromedriver/下載對應的版本就好,如果是其他的瀏覽器,則需要下載對應的瀏覽器驅動程式,這種不再做進一步介紹。
4.1模擬百度搜尋
第一步還是需要開啟目標的地址“w w w.baidu.com”,分析目標網頁中目標元素的特點,如下圖所示:
通過分析,我們很容易就找到搜尋框的id為kw,點選按鈕的id為su,餘下的就是使用方法進行模擬。
實現的程式碼如下所示:
from selenium import webdriver
#get 方法 開啟指定網址
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#選擇網頁元素
element_keyword = driver.find_element_by_id('kw')
#輸入字元
element_keyword.send_keys('python 爬蟲')
#找到搜尋按鈕
element_search_button = driver.find_element_by_id('su')
element_search_button.click()
driver.close()
4.2模擬自動登入網易163郵箱傳送郵件
操作過程跟上面相似,第一步也是分析目標網頁http://mail.163.com。
如下圖所示:
找到了目標標籤然後就是模擬登入。
實現程式碼如下:
# coding:UTF-8
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://mail.163.com/')
driver.switch_to_frame(driver.find_element_by_tag_name('iframe'))
# driver.switch_to_frame('x-URS-iframe')
driver.find_element_by_name('email').clear()
driver.find_element_by_name('email').send_keys('郵箱地址')
driver.find_element_by_name('password').send_keys('郵箱密碼', Keys.ENTER)
# 跳轉頁面時,強制等待6s
time.sleep(6)
# 點選寫信按鈕
driver.find_element_by_xpath("//div[@id='dvNavTop']/ul/li[2]/span[2]").click()
time.sleep(2)
# 收件人
driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys('目標的郵箱')
driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @type='text' and @maxlength='256']").send_keys(
u'測試') # 主題
xpath = driver.find_element_by_xpath("//div[@class='APP-editor-edtr']/iframe")
# 文字內容在iframe中
driver.switch_to_frame(xpath)
driver.find_element_by_xpath("//body[@class='nui-scroll' and @contenteditable='true']").send_keys(u'這是一個自動化測試郵件')
# 傳送按鈕在iframe外,所以需要跳出
driver.switch_to_default_content()
# 傳送
driver.find_element_by_xpath("//div[@class='nui-toolbar-item']/div/span[2]").click()
driver.close()
當然,在實際過程中,可能往往還有驗證碼的驗證。因為現在的驗證碼難度越來越大,形式也多種多樣,使用常規的方法很難解決,必須藉助機器學習或者第三方介面進行實現,將在後續單獨列一個章節進行介紹如何破解驗證碼。