1. 程式人生 > >Selenium-網路資料採集工具庫-初學篇

Selenium-網路資料採集工具庫-初學篇

目錄

庫介紹

Selenium是一個強大的網路資料採集工具(http://www.seleniumhq.org/),最初是為網站自動化測試而開發,同時也它們也可以執行在瀏覽器上。在Python中應用功能主要如下:

  • 讓瀏覽器自動載入頁面
  • 獲取瀏覽器網頁載入的資料
  • 頁面截圖
  • 判斷網站上某些動作是否發生

專案環境

作業系統:win10

python版本:3.6

解析器:pycharm2018

Selenium文件:

使用流程

一、下載並安裝selenium庫

2、通過三方管理器pip下載:

$ pip install selenium

二、下載第三方瀏覽器驅動

Selenium自己不帶瀏覽器,需要與第三方瀏覽器結合使用。

1、通過PhantomJS讓程式在後臺執行(下載地址:http://phantomjs.org/download.html)它會把網頁載入到記憶體並執行頁面上的JavaScript,但不會展示網頁的圖形介面。可以處理cookie,JavaScript,header等,現在Selenium庫已經不支援PhantomJS。

2、選擇在瀏覽器Chrome/Firefox上執行Selenium:

三、案例

(一)Ajax網頁測試

from selenium import webdriver
import time
# 用瀏覽器執行selenium,需要將下載的chromedriver.exe儲存在對應python工程下或指定其他地址
driver = webdriver.Chrome() # chromedriver這裡放在工程目錄下
# 開啟網頁
driver.get('http://pythonscraping.com/pages/javascript/ajaxDemo.html')
# Ajax測試,由於測試網頁有ajax載入2秒,所以這裡暫停執行3秒
time.sleep(3)
print(driver.find_element_by_id('content').text)
# 關閉網頁
driver.close()

(二)檢測網頁載入成功後再執行

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# 建立webdriver
driver = webdriver.Chrome()
# 開啟網頁
driver.get('http://pythonscraping.com/pages/javascript/ajaxDemo.html')
# 檢測網頁執行。是否出現某個元素後執行
try:
    # driver等待10秒,直到網頁出現元素標籤ID名為loadedButton
    elements = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator=(By.ID, 'loadedButton')))
finally:
    # 抓取content元素中的文字
    print(driver.find_element_by_id('content').text)
# 關閉網頁
driver.close()

說明:

  1. 一般通過WebDriverWait類和expected_conditions類來實現隱式的等待。
  2. locator定位器物件,用來定位網頁元素
  3. 一般定位:ID/CLASS_NAME/CSS_SELECTOR/LINK_TEXT/PARTIAL_LINK_TEXT/NAME/TAG_NAME/XPATH

(三)處理重定向

from selenium import webdriver
import time
from selenium.common.exceptions import StaleElementReferenceException

def waitForLoad(driver):
    elem = driver.find_element_by_tag_name('html')
    count = 0
    while True:
        count += 1
        if count > 20:
            print('Timing out after 10 seconds and returning')
            return
        time.sleep(.5)
        try:
            elem == driver.find_element_by_tag_name('html')
        except StaleElementReferenceException as e:
            print(e)
            return

# 建立webdriver
driver = webdriver.Chrome()
# 開啟網頁
driver.get('http://pythonscraping.com/pages/javascript/redirectDemo1.html')
# 檢測網頁執行。是否出現某個元素後執行
try:
    waitForLoad(driver)
finally:
    print(driver.page_source)
# 關閉網頁
driver.close()

說明:可以通過異常類StaleElementReferenceException,來實現監控網頁變化的效果。當driver無法捕捉到html元素標籤,則觸發異常,等同於網頁已經實現重定向。