本節主要學習selenium自動化測試架構在爬蟲中的應用,selenium能夠大幅降低爬蟲的編寫難度,但是也同樣會大幅降低爬蟲的爬取速度。在逼不得已的情況下我們可以使用selenium進行爬蟲的編寫。
知識點:
- 了解 selenium的工作原理
- 了解 selenium以及chromedriver的安裝
- 掌握 标簽對象click點選以及send_keys輸入
1. selenium運作效果展示
Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,Selenium 可以直接調用浏覽器,它支援所有主流的浏覽器(包括PhantomJS這些無界面的浏覽器),可以接收指令,讓浏覽器自動加載頁面,擷取需要的資料,甚至頁面截屏等。我們可以使用selenium很容易完成之前編寫的爬蟲,接下來我們就來看一下selenium的運作效果
1.1 chrome浏覽器的運作效果
在下載下傳好chromedriver以及安裝好selenium子產品後,執行下列代碼并觀察運作的過程
from selenium import webdriver
# 如果driver沒有添加到了環境變量,則需要将driver的絕對路徑指派給executable_path參數
# driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
# 如果driver添加了環境變量則不需要設定executable_path
driver = webdriver.Chrome()
# 向一個url發起請求
driver.get("http://www.itcast.cn/")
# 把網頁儲存為圖檔,69版本以上的谷歌浏覽器将無法使用截圖功能
# driver.save_screenshot("itcast.png")
print(driver.title) # 列印頁面的标題
# 退出模拟浏覽器
driver.quit() # 一定要退出!不退出會有殘留程序!
1.2 phantomjs無界面浏覽器的運作效果
PhantomJS 是一個基于Webkit的“無界面”(headless)浏覽器,它會把網站加載到記憶體并執行頁面上的 JavaScript。下載下傳位址:http://phantomjs.org/download.html
from selenium import webdriver
# 指定driver的絕對路徑
driver = webdriver.PhantomJS(executable_path='/home/worker/Desktop/driver/phantomjs')
# driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
# 向一個url發起請求
driver.get("http://www.itcast.cn/")
# 把網頁儲存為圖檔
driver.save_screenshot("itcast.png")
# 退出模拟浏覽器
driver.quit() # 一定要退出!不退出會有殘留程序!
1.3 觀察運作效果
- python代碼能夠自動的調用谷歌浏覽或phantomjs無界面浏覽器,控制其自動通路網站
1.4 無頭浏覽器與有頭浏覽器的使用場景
- 通常在開發過程中我們需要檢視運作過程中的各種情況是以通常使用有頭浏覽器
- 在項目完成進行部署的時候,通常平台采用的系統都是伺服器版的作業系統,伺服器版的作業系統必須使用無頭浏覽器才能正常運作
2. selenium的作用和工作原理
利用浏覽器原生的API,封裝成一套更加面向對象的Selenium WebDriver API,直接操作浏覽器頁面裡的元素,甚至操作浏覽器本身(截屏,視窗大小,啟動,關閉,安裝插件,配置證書之類的)
- webdriver本質是一個web-server,對外提供webapi,其中封裝了浏覽器的各種功能
- 不同的浏覽器使用各自不同的webdriver
知識點:了解 selenium的工作原理
3. selenium的安裝以及簡單使用
我們以谷歌浏覽器的chromedriver為例
3.1 在python虛拟環境中安裝selenium子產品
pip/pip3 install selenium
3.2 下載下傳版本符合的webdriver
以chrome谷歌浏覽器為例
- 檢視谷歌浏覽器的版本
- 通路https://npm.taobao.org/mirrors/chromedriver,點選進入不同版本的chromedriver下載下傳頁面
2.點選notes.txt進入版本說明頁面
3.檢視chrome和chromedriver比對的版本
4.根據作業系統下載下傳正确版本的chromedriver
5.解壓壓縮包後擷取python代碼可以調用的谷歌浏覽器的webdriver可執行檔案
- windows為chromedriver.exe
- linux和macos為chromedriver
6.chromedriver環境的配置
- windows環境下需要将 chromedriver.exe 所在的目錄設定為path環境變量中的路徑
- linux/mac環境下,将 chromedriver 所在的目錄設定到系統的PATH環境值中
知識點:了解 selenium以及chromedriver的安裝
4. selenium的簡單使用
接下來我們就通過代碼來模拟百度搜尋
import time
from selenium import webdriver
# 通過指定chromedriver的路徑來執行個體化driver對象,chromedriver放在目前目錄。
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriver已經添加環境變量
driver = webdriver.Chrome()
# 控制浏覽器通路url位址
driver.get("https://www.baidu.com/")
# 在百度搜尋框中搜尋'python'
driver.find_element_by_id('kw').send_keys('python')
# 點選'百度搜尋'
driver.find_element_by_id('su').click()
time.sleep(6)
# 退出浏覽器
driver.quit()
- webdriver.Chrome(executable_path='./chromedriver')中executable參數指定的是下載下傳好的chromedriver檔案的路徑
- driver.find_element_by_id('kw').send_keys('python')定位id屬性值是'kw'的标簽,并向其中輸入字元串'python'
- driver.find_element_by_id('su').click()定位id屬性值是su的标簽,并點選
- click函數作用是:觸發标簽的js的click事件
知識點:掌握 标簽對象click點選以及send_keys輸入。