python selenium 查找隱藏元素 自動(dòng)播放視頻功能
在使用python做爬蟲的過程中,有些頁面的的部分?jǐn)?shù)據(jù)是通過js異步加載的,js調(diào)用接口的請(qǐng)求中有時(shí)還帶有些加密的參數(shù)很難破解無法使用requests這樣的包直接爬取數(shù)據(jù),因此需要借助seleniu來完成js的自動(dòng)加載。
通過selenium 模擬瀏覽器的真是操作來獲取頁面中的所有請(qǐng)求,并且可以查找到一下頁面上一些隱藏的元素,這些元素在html源碼中無法看到,并且和能通過xpath和正則來捕獲,因此需要使用selenium來查找隱藏元素,例如視頻網(wǎng)站的播放按鈕
代碼如下
import time # 導(dǎo)入自動(dòng)化測(cè)試模塊 from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.action_chains import ActionChains import re import json d = DesiredCapabilities.CHROME d['loggingPrefs'] = {'performance': 'ALL'} # 設(shè)置谷歌瀏覽器參數(shù),設(shè)置語言和瀏覽器版本(使用真實(shí)瀏覽器頭信息代替字符瀏覽器頭) options = webdriver.ChromeOptions() options.add_argument('lang=zh_CN.UTF-8') options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36"') # 建立一個(gè)瀏覽器對(duì)象,調(diào)用PhantoJS來生成一個(gè)對(duì)象 browser = webdriver.Chrome(executable_path='D:\Python36\chromedriver.exe', chrome_options=options, desired_capabilities=d) video_url = 'https://v.youku.com/v_show/id_XNDIyMjU1NjgzMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_2&s=a4de6bdc5675415ea280&scm=20140719.manual.2556.show_a4de6bdc5675415ea280' browser.get(video_url) time.sleep(10) menu = browser.find_element_by_css_selector(".ykplayer") # 查找頁面隱藏元素 # menu = browser.find_element_by_css_selector("div.x-video-play-ico.i-pause > dt").text print(menu) print(type(menu)) menu = browser.find_element_by_css_selector(".ykplayer").text # 獲得隱藏元素的內(nèi)容 print(menu) print(type(menu)) ################### #ActionChains(browser).click() browser.find_element_by_css_selector('.ykplayer').click() # 查找到隱藏元素位置后執(zhí)行點(diǎn)擊鼠標(biāo)左鍵操作 time.sleep(10) lo = browser.get_log('performance') # 捕獲瀏覽器network中的數(shù)據(jù) browser.get_network_conditions() datalist = [] for entry in lo: try: print(entry) datalist.append(entry) except Exception as e: continue browser.close()
視頻中被播放按鈕是一個(gè)隱藏元素,用xpaht定位到指定的標(biāo)簽后也無法獲取這個(gè)標(biāo)簽中的元素
通過 browser.find_element_by_css_selector(“.ykplayer”)
方法查找 .ykplayer 可以查找到,查找后輸出的內(nèi)容這個(gè)視頻的標(biāo)題,這樣就實(shí)現(xiàn)了使用chromedriver
自動(dòng)播放視頻的功能
這里雖然實(shí)現(xiàn)的視頻自動(dòng)播放,但是請(qǐng)求優(yōu)酷視頻的視頻地址的接口調(diào)用的結(jié)果卻依然沒法通過 browser.get_log(‘performance')
來獲得,原因是有一部分?jǐn)?shù)據(jù)沒有全部加載,但接口實(shí)際已經(jīng)取得了完整的數(shù)據(jù)。雖然可以通過 get_log中的結(jié)果獲得請(qǐng)求的地址,但是這個(gè)請(qǐng)求的地址在此使用requests進(jìn)行請(qǐng)求會(huì)提示無權(quán)訪問,可以看到這個(gè)請(qǐng)求已經(jīng)有請(qǐng)求體了,但是使用get_log卻無法捕獲。
而且這個(gè)請(qǐng)求地址是一次性的,在次請(qǐng)求的結(jié)果是沒權(quán)限
{"cost":0.003000000026077032,"data":{"error":{"note":"客戶端無權(quán)播放,201","code":-6004}},"e":{"code":0,"provider":"hsfprovider","desc":""}}
要解決這個(gè)問題需要使用到browsermob-proxy
利用BrowserMob Proxy實(shí)現(xiàn)類似chrome的開發(fā)者工具中network的功能,
監(jiān)控瀏覽器中該頁面的request,獲取對(duì)應(yīng)的response,從而得到對(duì)應(yīng)的json數(shù)據(jù)。
其大致原理是設(shè)置一個(gè)本地代理,并監(jiān)控瀏覽器通過該代理的網(wǎng)絡(luò)活動(dòng)。
最后,我的解決方案是:python3 + selenium + chrome + browsermob-proxy
下載好BrowserMob Proxy和chromedriver,并記住對(duì)應(yīng)的路徑,稍后需要配置。
http://npm.taobao.org/mirrors/chromedriver/
另外,使用browsermob-proxy
需要安裝Java依賴環(huán)境,首次安裝后可能需要重啟。
python的環(huán)境可安裝anaconda獲得,然后是安裝額外的python庫
pip install browsermob-proxy pip install selenium
軟件環(huán)境配置完成后,可開始搭建抓取動(dòng)態(tài)網(wǎng)頁的框架,
下面是我做的一個(gè)簡(jiǎn)單框架(browsermonitor.py),其中未涉及數(shù)據(jù)的加工,可針對(duì)需要抓取的網(wǎng)頁,直接繼承后,根據(jù)需求加工數(shù)據(jù):
? """step 1 導(dǎo)入依賴庫""" from os import path from browsermobproxy import Server from selenium import webdriver import re """step 2 新建瀏覽器監(jiān)控類""" class Monitor(object): """ step 3 配置chromedriver 和 browermobproxy 路徑 需要使用完整路徑,否則browsermobproxy無法啟動(dòng)服務(wù) 我是將這兩個(gè)部分放到了和monitor.py同一目錄 同時(shí)設(shè)置chrome為屏蔽圖片,若需要抓取圖片可自行修改 """ PROXY_PATH = path.abspath("./browsermob-proxy/bin/browsermob-proxy.bat") CHROME_PATH = path.abspath("./chromedriver.exe") CHROME_OPTIONS = {"profile.managed_default_content_settings.images":2} def __init__(self): """ 類初始化函數(shù)暫不做操作 """ pass def initProxy(self): """ step 4 初始化 browermobproxy 設(shè)置需要屏蔽的網(wǎng)絡(luò)連接,此處屏蔽了css,和圖片(有時(shí)chrome的設(shè)置會(huì)失效),可加快網(wǎng)頁加載速度 新建proxy代理地址 """ self.server = Server(self.PROXY_PATH) self.server.start() self.proxy = self.server.create_proxy() self.proxy.blacklist(["http://.*/.*.css.*","http://.*/.*.jpg.*","http://.*/.*.png.*","http://.*/.*.gif.*"],200) def initChrome(self): """ step 5 初始化selenium, chrome設(shè)置 將chrome的代理設(shè)置為browermobproxy新建的代理地址 """ chromeSettings = webdriver.ChromeOptions() chromeSettings.add_argument('--proxy-server={host}:{port}'.format(host = "localhost", port = self.proxy.port)) chromeSettings.add_experimental_option("prefs", self.CHROME_OPTIONS) self.driver = webdriver.Chrome(executable_path = self.CHROME_PATH, chrome_options = chromeSettings) def genNewRecord(self, name = "monitor", options={'captureContent':True}): """ step 6 新建監(jiān)控記錄,設(shè)置內(nèi)容監(jiān)控為True """ self.proxy.new_har(name,options = options) def getContentText(self, targetUrl): """ step 7 簡(jiǎn)單的獲取目標(biāo)數(shù)據(jù)的函數(shù) 其中 targetUrl 為瀏覽器獲取對(duì)應(yīng)數(shù)據(jù)調(diào)用的url,需要用正則表達(dá)式表示 """ if self.proxy.har['log']['entries']: for loop_record in self.proxy.har['log']['entries']: try: if re.fullmatch(targetUrl , loop_record["request"]['url']): return loop_record["response"]['content']["text"] except Exception as err: print(err) continue return None def Start(self): """step 8 配置monitor的啟動(dòng)順序""" try: self.initProxy() self.initChrome() except Exception as err: print(err) def Quit(self): """ step 9 配置monitor的退出順序 代理sever的退出可能失敗,目前是手動(dòng)關(guān)閉,若誰能提供解決方法,將不勝感激 """ self.driver.close() self.driver.quit() try: self.proxy.close() self.server.process.terminate() self.server.process.wait() self.server.process.kill() except OSError: pass if __name__ == '__main__': monitor = Monitor() monitor.Start() monitor.genNewRecord() # 這使用優(yōu)酷視頻的地址 url = 'https://v.youku.com/v_show/id_XNDIyMjU1NjgzMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_2&s=a4de6bdc5675415ea280&scm=20140719.manual.2556.show_a4de6bdc5675415ea280' monitor.driver.get(url) targetUrl = "https://ups.youku.com/ups/get.json.*" # 這是獲取視頻播放地址的接口請(qǐng)求的前綴 text = monitor.getContentText(targetUrl) monitor.Quit()
總結(jié)
以上所述是小編給大家介紹的python selenium 查找隱藏元素 自動(dòng)播放視頻功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
用Python做一個(gè)簡(jiǎn)單的圖書管理系統(tǒng)
這篇文章主要介紹了用Python做一個(gè)簡(jiǎn)單的圖書管理系統(tǒng),有“還書““借閱”“添加書籍”等功能,文中提供了部分實(shí)現(xiàn)代碼和解決思路,有一定的參考價(jià)值,需要的朋友快來一起看看吧2023-04-04利用python設(shè)計(jì)圖像加密技術(shù)(Arnold算法)
這篇文章主要介紹了利用python設(shè)計(jì)圖像加密技術(shù)(Arnold算法),本文將借助Arnold置亂法,講解如何用python從頭至尾設(shè)計(jì)出一套圖像加密算法,需要的小伙伴可以才參考一下2022-03-03python編程學(xué)習(xí)np.float 被刪除的問題解析
這篇文章主要為大家介紹了python編程學(xué)習(xí)np.float 被刪除的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Python讀取txt文件數(shù)據(jù)的方法(用于接口自動(dòng)化參數(shù)化數(shù)據(jù))
這篇文章主要介紹了Python讀取txt文件數(shù)據(jù)的方法(用于接口自動(dòng)化參數(shù)化數(shù)據(jù)),需要的朋友可以參考下2018-06-06在VSCode中搭建Python開發(fā)環(huán)境并進(jìn)行調(diào)試
這篇文章介紹了在VSCode中搭建Python開發(fā)環(huán)境并進(jìn)行調(diào)試的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式
這篇文章主要介紹了django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸入的操作
這篇文章主要介紹了python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸入的操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式
今天小編就為大家分享一篇利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01