在前面爬蟲的相關介紹中,我們介紹了如何抓取靜態頁面資訊,但是,在實際的網頁瀏覽程序中,我們可能會經常碰到各種需要進行互動的操作,典型的如輸入資訊、點擊按鈕之類,
對于這種場景,之前的靜態頁面操作方式已經不能滿足需求,這時我們需要借助新的工具,比如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()

當然,在實際程序中,可能往往還有驗證碼的驗證,因為現在的驗證碼難度越來越大,形式也多種多樣,使用常規的方法很難解決,必須借助機器學習或者第三方介面進行實作,將在后續單獨列一個章節進行介紹如何破解驗證碼,
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/116880.html
標籤:Python
下一篇:11.DRF-權限
