selenium動(dòng)態(tài)數(shù)據(jù)獲取的方法實(shí)現(xiàn)
Selenium 是一個(gè)自動(dòng)化測(cè)試工具,利用它可以驅(qū)動(dòng)瀏覽器執(zhí)行特定的動(dòng)作,如點(diǎn)擊、下拉等操作,同時(shí)還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁(yè)面的源代碼,做到可見即可獲取。對(duì)于一些 JavaScript 動(dòng)態(tài)渲染的頁(yè)面來說,此種抓取方式非常有效。接下來,就讓我們來感受一下它的強(qiáng)大之處吧。
??webdriver的安裝
??selenium安裝
首先,我們使用selenium進(jìn)行測(cè)試,所以我們得安裝selenium庫(kù)。
pip install selenium
??驅(qū)動(dòng)安裝
webdriver 是瀏覽器對(duì)應(yīng)的驅(qū)動(dòng),我們使用的的瀏覽器有三種谷歌Chrome、微軟Microsoft Edge、還有一個(gè)火狐Firefox,但是我們經(jīng)常使用谷歌Chrome瀏覽器進(jìn)行測(cè)試?,F(xiàn)在我們就以Chrome瀏覽器為例下載它對(duì)應(yīng)的chromedriver 。
官網(wǎng):http://chromedriver.storage.googleapis.com/index.html
注意:
我們下載chromedriver 驅(qū)動(dòng)時(shí),我們要查明瀏覽器的版本,要對(duì)應(yīng)相應(yīng)的版本號(hào)進(jìn)行下載,否則會(huì)報(bào)錯(cuò)。禁止Google瀏覽器更新服務(wù),可以上網(wǎng)查教程。
??基本使用
??查找節(jié)點(diǎn)
Selenium 可以驅(qū)動(dòng)瀏覽器完成各種操作,比如填充表單、模擬點(diǎn)擊等。比如,我們想要完成向某個(gè)輸入框輸入文字的操作,總需要知道這個(gè)輸入框在哪里吧?而 Selenium 提供了一系列查找節(jié)點(diǎn)的方法,我們可以用這些方法來獲取想要的節(jié)點(diǎn),以便下一步執(zhí)行一些動(dòng)作或者提取信息。
獲取節(jié)點(diǎn)的方法:
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text?? ??? ??? ??? ?專門用來定位超鏈接文本(標(biāo)簽) ?全匹配 find_element_by_partial_link_text ? ? ??? ? 模糊匹配 find_element_by_tag_name find_element_by_class_name find_element_by_css_selector?
給個(gè)示例
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') input = browser.find_element_by_id('kw') input.send_keys('Python') browser.find_element_by_id('su').click() # 提取頁(yè)面 print(browser.page_source.encode('utf-8')) # 提取cookie print(browser.get_cookies()) # 提取當(dāng)前請(qǐng)求地址 print(browser.current_url) browser.close()
運(yùn)行代碼后發(fā)現(xiàn),會(huì)自動(dòng)彈出一個(gè) Chrome 瀏覽器。瀏覽器首先會(huì)跳轉(zhuǎn)到百度,然后在搜索框中輸入 Python,接著跳轉(zhuǎn)到搜索結(jié)果頁(yè)
注:當(dāng)我們的chromedriver驅(qū)動(dòng)沒有放置到Chrome瀏覽器路徑時(shí),我們可以使用以下來申明瀏覽器對(duì)象。
browser = webdriver.Chrome(executable_path="chromedriver安裝路徑")
方法總結(jié):
- brower.get(url):跳轉(zhuǎn)當(dāng)前url鏈接。
- browser.find_element_by_id('id屬性值'):定位到id屬性值。
- send_keys('輸入關(guān)鍵字'):定位到輸入框后輸入。
- find_element_by_id('id屬性值').click():定位到id屬性值后點(diǎn)擊。
- browser.page_source.encode('utf-8'):獲取當(dāng)前頁(yè)面的源碼。
- browser.get_cookies():提取cookies。
- browser.current_url:獲取當(dāng)前頁(yè)面的url。
- brower.close():關(guān)閉瀏覽器。
??執(zhí)行 JavaScript
對(duì)于某些操作,Selenium API 并沒有提供。比如,下拉進(jìn)度條,它可以直接模擬運(yùn)行 JavaScript,此時(shí)使用 execute_script() 方法即可實(shí)現(xiàn),代碼如下:
# document.body.scrollHeight 獲取頁(yè)面高度 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://36kr.com/') # 下拉邊框 一次性下拉 browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') # 慢慢的下拉 for i in range(1,9): time.sleep(random.randint(100, 300) / 1000) browser.execute_script('window.scrollTo(0,{})'.format(i * 700))
這里就利用 execute_script() 方法將進(jìn)度條下拉到最底部。為了模擬人為活動(dòng),我們調(diào)節(jié)了下拉的緩沖時(shí)間。
我們使用瀏覽器的控制臺(tái)輸入以下代碼也能運(yùn)行。
window.scrollTo(0, document.body.scrollHeight)
圖例:
??切換 Frame
我們知道網(wǎng)頁(yè)中有一種節(jié)點(diǎn)叫作 iframe,也就是子 Frame,相當(dāng)于頁(yè)面的子頁(yè)面,它的結(jié)構(gòu)和外部網(wǎng)頁(yè)的結(jié)構(gòu)完全一致。Selenium 打開頁(yè)面后,它默認(rèn)是在父級(jí) Frame 里面操作,而此時(shí)如果頁(yè)面中還有子 Frame,它是不能獲取到子 Frame 里面的節(jié)點(diǎn)的。這時(shí)就需要使用 switch_to.frame() 方法來切換 Frame。示例如下:
browser.get('https://www.douban.com/') login_iframe = browser.find_element_by_xpath('//div[@class="login"]/iframe') browser.switch_to.frame(login_iframe) browser.find_element_by_class_name('account-tab-account').click() browser.find_element_by_id('username').send_keys('123123123')
首先我們要定位到iframe,然后用switch_to.frame() 方法來切換 Frame,這時(shí)我們就可以定位到子 Frame進(jìn)行有關(guān)操作了。
??前進(jìn)后退
平常使用瀏覽器時(shí)都有前進(jìn)和后退功能,Selenium 也可以完成這個(gè)操作,它使用 back() 方法后退,使用 forward() 方法前進(jìn)。示例如下:
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.python.org/') browser.back() time.sleep(1) browser.forward() browser.close()
這里我們連續(xù)訪問 3 個(gè)頁(yè)面,然后調(diào)用 back() 方法回到第二個(gè)頁(yè)面,接下來再調(diào)用 forward() 方法又可以前進(jìn)到第三個(gè)頁(yè)面。
??選項(xiàng)卡管理
在訪問網(wǎng)頁(yè)的時(shí)候,會(huì)開啟一個(gè)個(gè)選項(xiàng)卡。在 Selenium 中,我們也可以對(duì)選項(xiàng)卡進(jìn)行操作。示例如下:
import time 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]) browser.get('https://www.taobao.com') time.sleep(1) browser.switch_to_window(browser.window_handles[0]) browser.get('https://python.org')
這里我們先跳轉(zhuǎn)到百度再打開一個(gè)空白選項(xiàng)卡打印選項(xiàng)卡編號(hào),再跳轉(zhuǎn)到第二個(gè)選項(xiàng)卡也就是這個(gè)空白選項(xiàng)卡打開淘寶,休息一秒,再跳轉(zhuǎn)到第一個(gè)選項(xiàng)卡打開python官網(wǎng)。
??配置操作
selenium有很多配置,下面我舉幾個(gè)常見的。
options = webdriver.ChromeOptions() # 無頭模式 option.add_argument("-headless") #設(shè)置代理 options.add_argument('proxy-server=' +'192.168.0.28:808') #將瀏覽器最大化顯示 browser.maximize_window() # 設(shè)置寬高 browser.set_window_size(480, 800) # 通過js新打開一個(gè)窗口 driver.execute_script('window.open("https://www.baidu.com");') browser = webdriver.Chrome(chrome_options=options)
?繞過檢測(cè)
繞過檢測(cè)對(duì)于一些網(wǎng)站的自動(dòng)化反爬很管用。
# 設(shè)置屏蔽 options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') browsers = webdriver.Chrome(chrome_options=options) browsers.get('https://bot.sannysoft.com/')
這里我們使用下面這個(gè)網(wǎng)站進(jìn)行自動(dòng)化檢測(cè)
網(wǎng)站:https://bot.sannysoft.com/
我們沒設(shè)置繞過檢測(cè)
我們?cè)O(shè)置了繞過檢測(cè)后
到此這篇關(guān)于selenium動(dòng)態(tài)數(shù)據(jù)獲取的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)selenium動(dòng)態(tài)數(shù)據(jù)獲取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)現(xiàn)python?namedtuple元類編程
這篇文章主要為大家介紹了實(shí)現(xiàn)python?namedtuple元類編程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07pytorch 實(shí)現(xiàn)計(jì)算 kl散度 F.kl_div()
這篇文章主要介紹了pytorch 實(shí)現(xiàn)計(jì)算 kl散度 F.kl_div(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05解決項(xiàng)目pycharm能運(yùn)行,在終端卻無法運(yùn)行的問題
今天小編就為大家分享一篇解決項(xiàng)目pycharm能運(yùn)行,在終端卻無法運(yùn)行的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn)
本文主要介紹了Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python實(shí)現(xiàn)智能語(yǔ)音天氣預(yù)報(bào)
今天小編就為大家分享一篇python實(shí)現(xiàn)智能語(yǔ)音天氣預(yù)報(bào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12