PhantomJs:無頭瀏覽器,支持JavaScript。(即包含Js引擎、瀏覽器排版引擎等核心組件,可是沒有和用戶交互的界面的瀏覽器。)python
Selenium:WEB自動化測試工具。能夠直接運行在瀏覽器中。不一樣瀏覽器提供不一樣的操做接口,Selenium經過這些接口來操做瀏覽器。web
webdriver:Selenium的核心對象。經過它能夠操做瀏覽器、截圖、http訪問、http解析等。macos
開發實例1:處理異步請求。在查詢windows
# 獲取bing查詢數據 # 經過異步請求返回結果,因此直接訪問頁面不能獲取到搜索結果。 from selenium import webdriver # 核心驅動對象 import datetime import time import random # 建立核心對象webdriver # mac系統下的文件路徑的斜槓與windows下的是相反的 driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs') # 指定PhantomJS的執行文件的路徑 # 設置分辨率 driver.set_window_size(1280, 2400) # 訪問的url url = 'https://cn.bing.com/search?q=%E7%8C%AB' driver.get(url) # 用get方法打開網頁,模擬瀏覽器地址欄輸入地址 # 截圖:保存圖片 def save_picture(): base_dir = 'picture/' file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100)) driver.save_screenshot(file_name) # save_picture() # 訪問太快,會沒來得及加載動態頁面部分 # 方法1:等幾秒至頁面徹底加載出來 # time.sleep(5) # print('*'*30) # save_picture() # 間隔5秒以後再次訪問,就能夠得到徹底加載的頁面內容 # 方法2:在必定的重試次數內找到對應的標籤 MAXRETRYIES = 5 # 最大重試次數 while MAXRETRYIES: try: ele = driver.find_element_by_class_name('b_caption') # 找到須要等標籤元素即截圖保存 print(ele, MAXRETRYIES) save_picture() break except Exception as e: print(type(e)) # <class 'selenium.common.exceptions.NoSuchElementException'> print(e) # 捕獲錯誤 time.sleep(1) # 暫停一秒等頁面加載。 MAXRETRYIES -= 1 driver.close() # 同文件IO,要close
開發實例2:下拉框處理瀏覽器
from selenium import webdriver import datetime import random from selenium.webdriver.support.ui import Select #獲取有關select的包 driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs') # 指定PhantomJS的執行文件的路徑 driver.set_window_size(1280, 2400) # 設置窗口大小 # 保存圖片 def save_picture(): base_dir = 'picture/' file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100)) driver.save_screenshot(file_name) url = "https://www.oschina.net/search?scope=project&q=python" driver.get(url) # 用get方法打開網頁,模擬瀏覽器地址欄輸入地址 # 處理select,想選擇tag1的第一項 ele = driver.find_element_by_class_name('tag1') # 獲取元素 print(ele.tag_name) print('current_url1:', driver.current_url) save_picture() s = Select(ele) # Select()處理的必定是select下拉框對象 s.select_by_index(1) # web應用開發 time.sleep(2) print('current_url2:', driver.current_url) save_picture() driver.close()
開發實例3:模擬鍵盤操做登陸網頁cookie
from selenium import webdriver import datetime import time import random from selenium.webdriver.common.keys import Keys # 有關模擬鍵盤輸入的模塊 driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs') # 指定PhantomJS的執行文件的路徑 driver.set_window_size(1280, 2400) # 設置窗口大小 # 保存圖片 def save_picture(): base_dir = 'picture/' file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100)) driver.save_screenshot(file_name) url = 'https://www.oschina.net/home/login' driver.get(url) print(driver.current_url) # https://www.oschina.net/home/login save_picture() # 獲取郵箱和密碼的2個輸入框對象 email = driver.find_element_by_id('userMail') pwd = driver.find_element_by_id('userPassword') # 模擬鍵盤輸入數據 username = '18390900259' password = '123456' email.send_keys(username) pwd.send_keys(password) print(driver.current_url) # https://www.oschina.net/home/login save_picture() pwd.send_keys(Keys.ENTER) # 回車=>登陸 time.sleep(1) # 登陸後頁面會有跳轉 print(driver.current_url) # https://www.oschina.net/?nocache=1553228140174 save_picture() while True: # 循環直到找到對應標籤對象 time.sleep(1) print(driver.current_url) try: userinfo = driver.find_element_by_class_name('user-info') print(userinfo.text) # 打印該標籤下的文本內容 save_picture() break except Exception as e: print(e) cookies = driver.get_cookies() # 獲取長期登錄的cookie print(cookies) print(cookies) driver.close() # 記得要關閉
開發實例4:頁面等待dom
愈來愈多的頁面使用Ajax的異步加載技術,會致使頁面中要被訪問的內容還沒加載就被訪問了,代碼拋出異常。異步
方法:工具
1.線程休眠:time.sleep(n)來等待數據加載。1.1:配合循環一直等到數據加載完成;1.2設置最大重試次數,避免一直循環下去。測試
2.Selenium等待:2.1:隱式等待:等待特定時間;2.2:顯式等待:指定一個條件,直到條件成立繼續日後執行。或者設置超時時間,超時拋出異常。
2.1隱式等待
from selenium import webdriver # 頁面隱式等待 driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs') driver.implicitly_wait(10) # 增長這一句,全局設置,會致使下面找元素等待10秒 url = "https://movie.douban.com/" driver.get(url) try: print('begin-------') ele = driver.find_element_by_id('abcde') # 在這裏查找的時限爲10秒,沒找到跳轉到except裏 except Exception as e: print(type(e)) # <class 'selenium.common.exceptions.NoSuchElementException'> print(e, '~~~~~~~~~~') finally: driver.quit()
2.2顯式等待
# 定位搜索框,搜索電影 from selenium import webdriver # 核心對象 import datetime import random # 鍵盤操做 from selenium.webdriver.common.keys import Keys # WebDriverWait負責循環等待 from selenium.webdriver.support.wait import WebDriverWait # expected_conditions負責條件觸發 from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.by import By driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs') driver.set_window_size(1280, 2400) # 窗口大小 # 打開網頁,使用get方法 url = 'https://movie.douban.com/' driver.get(url) def save_picture(): base_dir = 'picture/' file_name = "{}{:%Y%m%d%H%M%S}{:03}.png".format(base_dir, datetime.datetime.now(), random.randint(1,100)) driver.save_screenshot(file_name) try: # 元素是否已加載到dom樹中;使用哪一個driver,等到什麼條件ok,ec就是等待的條件;expected有不少內置條件方法;20秒爲超時時長,超時拋異常,超時時長內在try裏默認0.5秒循環執行 ele = WebDriverWait(driver, 20).until( ec.presence_of_element_located((By.ID, 'inp-query')) # ex.presence_of_element_located(By.XPATH, '//input[@id="inp-query]' # 兩種不一樣的寫法:一個經過id查找元素,一個經過xpath
) ele.send_keys('TRON') # 加載出搜索框後,在搜索框內輸入'TRON',進行搜索 save_picture() ele.send_keys(Keys.ENTER) # 輸入回車鍵,開始搜索 print(driver.current_url) # 查看搜索後跳轉的url save_picture() finally: driver.quit() # 退出瀏覽器