歡迎大家關注公眾號【哈希大數(shù)據(jù)】
Selenium庫是Python的自動化測試工具绽昼,它支持多種瀏覽器包括Chrome、Mozilla Firefox河狐、PhantomJS等征椒。在爬蟲中主要解決因為利用JavaScript渲染操作不能利用Requests庫獲取網(wǎng)頁內容的問題。利用JavaScript渲染的網(wǎng)站有很多典型的如淘寶末荐、今日頭條侧纯、一點資訊、快遞100等甲脏。
Selenium安裝與測試
對于Windows平臺:首先介紹一種簡單的安裝包的方法眶熬,打開cmd,執(zhí)行pip install selenium。如果第一種方法出現(xiàn)如timeout等問題块请,我們還可以采用手動方法安裝娜氏,步驟如下:
1、登陸該網(wǎng)站(https://www.lfd.uci.edu/~gohlke/pythonlibs/)下載你所需要的第三包的whl文件(用Ctrl+F命令搜索你想安裝的第三方包)墩新,建議存儲在Python安裝目錄中的\Lib\site-packages目錄下贸弥。
2、下載完成后打開命令行海渊,輸入pip install 文件絕對路徑 绵疲,然后點擊回車就OK啦。
完成Selenium庫的安裝后臣疑,我們需要下載一些瀏覽器驅動器盔憨,這里建議大家使用Chrome瀏覽器,為此我們需要在電腦上下載一個chromedriver讯沈,下載chromedriver時需要注意的問題是與電腦上的chrome瀏覽器版本要對應郁岩。大家可以按下面這個連接中給定的映射關系進行下載:http://blog.csdn.net/huilan_same/article/details/51896672,感謝huilan_same的分享缺狠。chromedriver的下載地址:http://npm.taobao.org/mirrors/chromedriver/
下載的chromedriver需要配置進path環(huán)境變量问慎,也可以用我下面的語句加入executable_path參數(shù),后面為 chromedriver的絕對路徑儒老,chromedriver_win32為存放chromedriver.exe的文件夾蝴乔。下面對Selenium進行簡單的測試:
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get("http://www.baidu.com")
print(browser.page_source)
browser.close()
查找元素
1.查找單個元素
selenium查找元素的方法有很多:
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面舉一個例子:
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get("http://www.taobao.com")
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()
例子中通過三種不同的方式去獲取響應的元素记餐,第一種是通過id的方式驮樊,第二個中是CSS選擇器,第三種是xpath選擇器,結果都是相同的
2.查找多個元素
查找多元素與查找單個元素的區(qū)別不大囚衔,在函數(shù)名上多加了一個s例如:find_elements_by_name挖腰。查找大哥元素返回的是符合查找條件的第一個標簽,查找多個元素返回的是符合條件的所有標簽练湿。
3.獲取元素屬性
在查找到相應元素后可以利用get_attribute(屬性名稱)函數(shù)獲取屬性值
舉一個簡單的例子如下:
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('https://www.taobao.com/')
input_str = driver.find_element_by_id('q')
print(input_str.get_attribute('aria-label'))
得到的結果是:"請輸入搜索文字"
4.獲取文本值
與獲取元素屬性類似猴仑,不過更簡單,直接在查找到元素后利用其text方法
5.獲取標簽位置及大小
與獲取文本值一樣肥哎,獲取位置的方法為location辽俗,獲取大小的方法為size
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('https://www.taobao.com/')
input_str = driver.find_element_by_id('q')
print(input_str.location)
print(input_str.size)
模擬操作
1.元素交互操作
元素交互操作是指咱們經(jīng)常用到的如查詢操作,登陸操作等
下面舉一個查詢操作的例子:
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('http://www.kuaidi100.com/')
# print('cookies:', driver.get_cookies())
browser.find_element_by_name("postid").clear() # 清空輸入框內容
browser.find_element_by_name("postid").send_keys('3346535929281') # 輸入訂單號
browser.find_element_by_id("query").click() # 點擊搜索按鈕
該例是在快遞100中查詢一個訂單的物流信息篡诽。
2.執(zhí)行JavaScript操作
這是一個非常有用的方法崖飘,這里就可以直接調用js方法來實現(xiàn)一些操作,下面的例子是打開快遞100通過js翻到頁面底部
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('http://www.kuaidi100.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
切換Frame
frame標簽是比較特殊的杈女,定位該標簽內部的元素時必須先切換到對應的frame內朱浴,通過下面的例子演示這里常用的是switch_to.frame()和switch_to.parent_frame():
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome()
browser.get('http://bj.96weixin.com/')
browser.switch_to.frame('ueditor_1')
source = browser.find_element_by_class_name('view')
print(source)
try:
logo = browser.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[1]/a/h1/img')except NoSuchElementException: print('NO LOGO')browser.switch_to.parent_frame()logo = browser.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[1]/a/h1/img')
print(logo)print(logo.get_attribute('src'))
很多時候網(wǎng)頁中要獲取的內容顯示其在一個框框里面,大家就要查看其是不是在各個框架內达椰,避免出錯翰蠢。
等待
網(wǎng)頁中很多內容是通過Ajax加載,需要一定時間才能加載出來啰劲,但selenium默認的是打開網(wǎng)頁后變開始定位元素梁沧,這樣容易出現(xiàn)找不到元素這樣的問題,不過selenium提供了兩種等待元素出現(xiàn)的方式:顯示等待和隱式等待蝇裤。
1.顯示等待
指定一個等待條件趁尼,并且指定一個最長等待時間,會在這個時間內進行判斷是否滿足等待條件猖辫,如果成立就會立即返回酥泞,如果不成立,就會一直等待啃憎,直到等待你指定的最長等待時間芝囤,如果還是不滿足,就會拋出異常辛萍,如果滿足了就會正常返回悯姊。
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
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
上述的例子中的條件:EC.presence_of_element_located()是確認元素是否已經(jīng)出現(xiàn)了EC.element_to_be_clickable()是確認元素是否是可點擊的
常用的判斷條件:
title_is 標題是某內容
title_contains 標題包含某內容
presence_of_element_located 元素加載出,傳入定位元組贩毕,如(By.ID, 'p')
visibility_of_element_located 元素可見悯许,傳入定位元組
visibility_of 可見,傳入元素對象
presence_of_all_elements_located 所有元素加載出
text_to_be_present_in_element 某個元素文本包含某文字
text_to_be_present_in_element_value 某個元素值包含某文字
frame_to_be_available_and_switch_to_it frame加載并切換
invisibility_of_element_located 元素不可見
element_to_be_clickable 元素可點擊
staleness_of 判斷一個元素是否仍在DOM辉阶,可判斷頁面是否已經(jīng)刷新
element_to_be_ 元素可選擇先壕,傳元素對象
element_located_to_be_selected 元素可選擇瘩扼,傳入定位元組
element_selection_state_to_be 傳入元素對象以及狀態(tài),相等返回True垃僚,否則返回False
element_located_selection_state_to_be 傳入定位元組以及狀態(tài)集绰,相等返回True,否則返回False
alert_is_present 是否出現(xiàn)Alert
2.隱式等待
到了一定的時間發(fā)現(xiàn)元素還沒有加載谆棺,則繼續(xù)等待我們指定的時間栽燕,如果超過了我們指定的時間還沒有加載就會拋出異常,如果沒有需要等待的時候就已經(jīng)加載完畢就會立即執(zhí)行改淑。
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
選項卡管理
通過執(zhí)行window.open()實現(xiàn)新開選項卡
通過browser.window_handles函數(shù)可以獲得選項卡列表
通過browser.window_handles[n]就可以操作第n個選項卡
通過browser.close()關閉當前選項卡
from selenium import webdriver
browser = webdriver.Chrome()browser.get('https://www.baidu.com')
browser.execute_script('window.open()')# 打開一個新的選項卡print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])#切換到第二個選項卡碍岔,注意這里0為第一個
browser.get('https://www.taobao.com')time.sleep(1)browser.close()#關閉當前選項卡
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
小結
本文介紹了selenium庫的安裝和測試方法,本文主要介紹selenium驅動chrome瀏覽器的相關操作朵夏,其他瀏覽器基本一樣只是需要添加對應的瀏覽器驅動付秕,后面主要介紹了如何查找元素、獲取屬性值侍郭、模擬人的操作询吴、操作frame內的元素、等待亮元、選項卡管理猛计。更多的內容請到:
http://selenium-python.readthedocs.io/api.html