国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

這篇具有很好參考價(jià)值的文章主要介紹了Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

我最近使用Python爬取網(wǎng)頁(yè)內(nèi)容時(shí)遇到Flex渲染的動(dòng)態(tài)頁(yè)面,比如下圖的課程目錄標(biāo)題,此時(shí)按鼠標(biāo)右鍵,菜單里沒(méi)有復(fù)制鏈接的選項(xiàng)。

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

我的目的是:獲取各個(gè)視頻標(biāo)題、鏈接。

按F12進(jìn)入開發(fā)者模式分析網(wǎng)頁(yè),可見有多個(gè)flex標(biāo)簽,像這種通過(guò)flex動(dòng)態(tài)渲染的網(wǎng)頁(yè),視頻鏈接隱藏在JS代碼里,需要人工點(diǎn)擊才能運(yùn)算出正確的鏈接,普通的requests庫(kù)的get是無(wú)法直接獲取的。

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

于是改變思路,嘗試selenium的webdriver來(lái)打開瀏覽器,打開該網(wǎng)頁(yè),然后用find_element的By來(lái)搜索關(guān)鍵詞“視頻”,看看能不能定位到“視頻”的元素:

from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
# 關(guān)掉密碼彈窗
options.add_experimental_option("prefs", prefs)
# 關(guān)閉提示“您的連接不是私密連接”
options.add_argument("--ignore-certificate-errors")
# 關(guān)閉提示“Chrome受自動(dòng)控制提示”
options.add_experimental_option('useAutomationExtension', False) 
# 關(guān)閉提示“Chrome受自動(dòng)控制提示”
options.add_experimental_option('excludeSwitches', ['enable-automation']) 
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(options=options)

driver.get('......') # 打開網(wǎng)頁(yè)url

l1=driver.find_element(By.PARTIAL_LINK_TEXT,'視頻')
l2=driver.find_element(By.LINK_TEXT,'視頻')

結(jié)果無(wú)論是l1還是l2,都會(huì)報(bào)錯(cuò)。

再嘗試別的辦法,如selenium的locate with:

from selenium.webdriver.support.relative_locator import locate_with, with_tag_name

l3=locate_with(By.LINK_TEXT, '視頻')
l3.click()

l3=locate_with(...) 這一行通過(guò)了,但下一句l3.click()報(bào)錯(cuò),提示沒(méi)有click()的屬性。

再想辦法,改為:

l4=driver.find_element(l3)
l4.click()

但同樣報(bào)錯(cuò):selenium.common.exceptions.NoSuchElementException: Message: Cannot locate relative element with: {'link text': '視頻'}

上面都使用了By.LINK_TEXT查找關(guān)鍵詞來(lái)定位,是希望能精確定位,但在Flex渲染的頁(yè)面里定位不了。

那么find_element改用By.CLASS_NAME又行不行?

l5=driver.find_element(By.CLASS_NAME,'item-title')
print(l5.text)

好!這下沒(méi)有報(bào)錯(cuò)。結(jié)果返回l5的值是字符串:'一張圖了解技術(shù)指標(biāo)(上)'

接下來(lái)發(fā)送點(diǎn)擊命令,如果順利的話就通過(guò)driver.current_url獲取播放視頻頁(yè)面的鏈接。

使用while 1循環(huán),遍歷查找所有class為“item-title”,直至查找報(bào)錯(cuò),跳出循環(huán)。

links=[]
# 參考來(lái)源:https://blog.csdn.net/saber_sss/article/details/103460706
new_location=WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME,'item-title')))

while 1:    
    try:
        # 查詢窗口總數(shù),返回一個(gè)包含所有窗口句柄handles的列表
        handles=driver.window_handles 
        title=new_location.text # 獲取視頻標(biāo)題
        new_location.click()
        # 對(duì)比一開始獲取的窗口總數(shù),確認(rèn)新窗口出現(xiàn)了再去切換
        WebDriverWait(driver,5).until(EC.new_window_is_opened(handles))
        # 切換到新窗口
        handles=driver.window_handles #再次獲取窗口句柄handles
        #執(zhí)行切換窗口操作
        driver.switch_to.window(handles[-1])
        links.append([title, driver.current_url])
        # 關(guān)閉當(dāng)前窗口
        driver.close()
        # 記得還要再切換去原來(lái)的窗口
        driver.switch_to.window(handles[0])
        last_location=new_location
        # 查找下一行
        new_location=driver.find_element(locate_with(By.CLASS_NAME,'item-title').below(last_location))
    except Exception:
        break

for i in links: print(i)

運(yùn)行結(jié)果:

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

貌似成功了。但是對(duì)比原網(wǎng)頁(yè)上的視頻標(biāo)題,獲取的結(jié)果少了一半,find_element代碼每次都隔行獲取,為什么會(huì)隔行?離得太近了嗎?

后來(lái)我到selenium的官網(wǎng)文檔里查看關(guān)于locators的用法,發(fā)現(xiàn)除了below是查找下一行之外,還有“near”查找,于是把below改為near,結(jié)果卻是查找到視頻標(biāo)題的第一行、第二行、第一行、第二行。。。如此循環(huán)。

為解決這個(gè)問(wèn)題,只能先后處理查找奇數(shù)行、偶數(shù)行,最后合并奇、偶行結(jié)果并重新排序。

# 初始化webdriver的過(guò)程不寫了

links = []
l1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'item-title')))
l2 = driver.find_element(locate_with(By.CLASS_NAME,'item-title').near(l1))
index = 0
for locator in (l1,l2):
    while 1:    
        try:
            # 查詢窗口總數(shù),返回一個(gè)包含所有窗口句柄handles的列表
            handles = driver.window_handles 
            title = locator.text
            locator.click()
            # 對(duì)比一開始獲取的窗口總數(shù),確認(rèn)新窗口出現(xiàn)了再去切換
            WebDriverWait(driver, 5).until(EC.new_window_is_opened(handles))
            # 再次獲取窗口句柄handles
            handles = driver.window_handles 
            # 新老句柄列表可以看出,新出現(xiàn)的句柄在列表里面排在后面
            # 執(zhí)行切換窗口操作
            driver.switch_to.window(handles[-1])
            print(index, title, driver.current_url)
            links.append([index, title, driver.current_url])
            driver.close()
            # 記得還要切換回原來(lái)的窗口
            driver.switch_to.window(handles[0])
            locator = driver.find_element(locate_with(By.CLASS_NAME,'item-title').below(locator))
            # 為解決隔行,index加2
            index+=2
        except Exception:
            # 查找不到再多的元素就退出循環(huán)
            break
    # 然后處理偶數(shù)行,index設(shè)為1
    index = 1
# 把結(jié)果重新排序
links = sorted(links)
for i in links: print(i)
driver.quit()

運(yùn)行結(jié)果截圖:

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

很不錯(cuò)!但還有一個(gè)bug:運(yùn)行結(jié)果的第2、3項(xiàng)重復(fù),估計(jì)是selenium的定位元素存在誤差造成的。

2023年4月13日更新:簡(jiǎn)單而優(yōu)雅的寫法

今天更新一下簡(jiǎn)單一點(diǎn)又沒(méi)有上述 bug 的方法。先來(lái)看第一幅圖:

Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容

之前的笨方法是先定位 class="item-title",由于有很多個(gè)相同的 class 元素,導(dǎo)致Selenium定位不準(zhǔn)確。

簡(jiǎn)單而優(yōu)雅的方法是:先定位 class="item-title" 的上一級(jí) class="column_catalog_item_wrap",然后從這個(gè)元素開始往下循環(huán)遍歷定位?class="item-title",再進(jìn)行點(diǎn)擊鏈接、獲取鏈接。

下面是優(yōu)化后的代碼:

# 初始化webdriver的過(guò)程不寫了

links = []
l1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'column_catalog_item_wrap')))
l2 = l1.find_elements(By.CLASS_NAME, 'item-title')

for index, locator in enumerate(l2):
    # 查詢窗口總數(shù),返回一個(gè)包含所有窗口句柄handles的列表
    handles=driver.window_handles 
    title=locator.text
    locator.click()
    # 對(duì)比一開始獲取的窗口總數(shù),確認(rèn)新窗口出現(xiàn)了再去切換
    WebDriverWait(driver,5).until(EC.new_window_is_opened(handles))
    # 再次獲取窗口句柄handles
    handles=driver.window_handles 
    # 新老句柄列表可以看出,新出現(xiàn)的句柄在列表里面排在后面
    # 執(zhí)行切換窗口操作
    driver.switch_to.window(handles[-1])
    print(index, title, driver.current_url)
    links.append([index, title, driver.current_url])
    driver.close()
    # 記得還要切換回原來(lái)的窗口
    driver.switch_to.window(handles[0])
    
for i in links: print(i)
driver.quit()

參考來(lái)源:

【1】?爬蟲實(shí)例(5)網(wǎng)頁(yè)動(dòng)態(tài)內(nèi)容的識(shí)別_網(wǎng)頁(yè)內(nèi)容分類識(shí)別_演技拉滿的白馬的博客-CSDN博客

【2】淺談selenium4新增功能之相對(duì)定位_the-ruffian的博客-CSDN博客_selenium相對(duì)定位法

【3】?python+selenium之窗口切換三種操作_saber_sss的博客-CSDN博客_python wd 切換窗口

【4】?Locator strategies | Selenium文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441847.html

到了這里,關(guān)于Python爬取網(wǎng)頁(yè)Flex渲染的動(dòng)態(tài)內(nèi)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JavaScript動(dòng)態(tài)渲染頁(yè)面爬取——Selenium的使用

    JavaScript動(dòng)態(tài)渲染頁(yè)面爬取——Selenium的使用

    JavaScript動(dòng)態(tài)渲染得頁(yè)面不止Ajax一種。例如,有些頁(yè)面的分頁(yè)部分由JavaScript生成,而非原始HTML代碼,這其中并不包含Ajax請(qǐng)求。還有類似淘寶這種頁(yè)面,即使是Ajax獲取的數(shù)據(jù),其Ajax接口中也含很多加密參數(shù),使我們難以直接找出規(guī)律,也很難直接通過(guò)分析Ajax爬取數(shù)據(jù)。 Pyt

    2024年04月11日
    瀏覽(28)
  • python爬蟲實(shí)戰(zhàn) scrapy+selenium爬取動(dòng)態(tài)網(wǎng)頁(yè)

    python爬蟲實(shí)戰(zhàn) scrapy+selenium爬取動(dòng)態(tài)網(wǎng)頁(yè)

    最近學(xué)習(xí)了scrapy爬蟲框架,想要找個(gè)目標(biāo)練練手。由于現(xiàn)在很多網(wǎng)頁(yè)都是動(dòng)態(tài)的,因此還需要配合selenium爬取。本文旨在記錄這次學(xué)習(xí)經(jīng)歷,如有疑問(wèn)或不當(dāng)之處,可以在評(píng)論區(qū)指出,一起學(xué)習(xí)。 對(duì)scrapy不了解的同學(xué)可以閱讀這篇文章 爬蟲框架 Scrapy 詳解,對(duì)scrapy框架介紹的

    2024年02月07日
    瀏覽(51)
  • 使用Apache HttpClient爬取網(wǎng)頁(yè)內(nèi)容的詳細(xì)步驟解析與案例示例

    Apache HttpClient是一個(gè)功能強(qiáng)大的開源HTTP客戶端庫(kù),本文將詳細(xì)介紹如何使用Apache HttpClient來(lái)爬取網(wǎng)頁(yè)內(nèi)容的步驟,并提供三個(gè)詳細(xì)的案例示例,幫助讀者更好地理解和應(yīng)用。 在項(xiàng)目的pom.xml文件中添加依賴,將以下代碼添加到pom.xml文件中: 創(chuàng)建一個(gè)名為WebCrawler的Java類。 使用

    2024年02月07日
    瀏覽(22)
  • python通過(guò)selenium爬取網(wǎng)頁(yè)信息,python獲取瀏覽器請(qǐng)求內(nèi)容,控制已經(jīng)打開的瀏覽器

    python通過(guò)selenium爬取網(wǎng)頁(yè)信息,python獲取瀏覽器請(qǐng)求內(nèi)容,控制已經(jīng)打開的瀏覽器

    背景:通過(guò)python中直接get或者urlopen打開一些有延遲加載數(shù)據(jù)的網(wǎng)頁(yè),會(huì)抓取不到部分信息。 1. 命令行打開chrome,并開啟調(diào)試端口 (前提,找到chrome安裝目錄,找到chrome.exe所在路徑,添加到環(huán)境變量中,例如我的是C:Program FilesGoogleChromeApplication) remote-debugging-port指定遠(yuǎn)程調(diào)試

    2024年02月16日
    瀏覽(97)
  • selenium爬取網(wǎng)頁(yè)內(nèi)容,對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行點(diǎn)擊

    selenium爬取網(wǎng)頁(yè)內(nèi)容,對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行點(diǎn)擊

    所需要的庫(kù) 首先明確所要爬取的網(wǎng)頁(yè),選擇調(diào)用方法,增加無(wú)界面模式的無(wú)頭參數(shù),然后調(diào)用,獲取網(wǎng)址,使頁(yè)面放大,為最大化窗口 獲取數(shù)據(jù)運(yùn)用XPATH函數(shù),將獲取的數(shù)據(jù)作為item,運(yùn)用XPATH函數(shù)獲取, ? 模仿人點(diǎn)擊下一頁(yè),運(yùn)用 for語(yǔ)句,每10個(gè)一點(diǎn),停留5秒 同樣尋找下一

    2024年01月17日
    瀏覽(27)
  • 使用Selenium抓取網(wǎng)頁(yè)動(dòng)態(tài)內(nèi)容

    Selenium 是一個(gè)自動(dòng)化測(cè)試工具,支持多種瀏覽器,包括 Chrome、Firefox、Edge 等,具有強(qiáng)大的瀏覽器自動(dòng)化能力,可以用于Web應(yīng)用程序的自動(dòng)化測(cè)試、數(shù)據(jù)挖掘等領(lǐng)域。Selenium的主要特點(diǎn)有: 支持多種瀏覽器 Selenium支持多種瀏覽器,包括Chrome、Firefox、Edge、Safari等,可以滿足不同

    2023年04月25日
    瀏覽(34)
  • 爬蟲入門指南(4): 使用Selenium和API爬取動(dòng)態(tài)網(wǎng)頁(yè)的最佳方法

    爬蟲入門指南(4): 使用Selenium和API爬取動(dòng)態(tài)網(wǎng)頁(yè)的最佳方法

    隨著互聯(lián)網(wǎng)的發(fā)展,許多網(wǎng)站開始采用動(dòng)態(tài)網(wǎng)頁(yè)來(lái)呈現(xiàn)內(nèi)容。與傳統(tǒng)的靜態(tài)網(wǎng)頁(yè)不同,動(dòng)態(tài)網(wǎng)頁(yè)使用JavaScript等腳本技術(shù)來(lái)實(shí)現(xiàn)內(nèi)容的動(dòng)態(tài)加載和更新。這給網(wǎng)頁(yè)爬取帶來(lái)了一定的挑戰(zhàn),因?yàn)閭鹘y(tǒng)的爬蟲工具往往只能獲取靜態(tài)網(wǎng)頁(yè)的內(nèi)容。本文將介紹如何使用Selenium和API來(lái)實(shí)現(xiàn)

    2024年02月11日
    瀏覽(34)
  • scrapy爬蟲爬取多網(wǎng)頁(yè)內(nèi)容

    摘要 :此案例是爬取目標(biāo)網(wǎng)站( https://tipdm.com/ )的 新聞中心 板塊的 公司新聞 中所有新聞的標(biāo)題、發(fā)布時(shí)間、訪問(wèn)量和新聞的文本內(nèi)容。 我使用的是 Anaconda prompt 我們使用如下命令創(chuàng)建scrapy項(xiàng)目: scrapy startproject spider_name 爬蟲路徑 spider_name 是項(xiàng)目的名字 爬蟲路徑 就是項(xiàng)目

    2023年04月21日
    瀏覽(29)
  • Python小姿勢(shì) - # 如何使用Python爬取網(wǎng)頁(yè)數(shù)據(jù)

    Python小姿勢(shì) - # 如何使用Python爬取網(wǎng)頁(yè)數(shù)據(jù)

    如何使用Python爬取網(wǎng)頁(yè)數(shù)據(jù) 今天我們來(lái)學(xué)習(xí)一下如何使用Python來(lái)爬取網(wǎng)頁(yè)數(shù)據(jù)。 首先,我們需要準(zhǔn)備一個(gè)空白的文件,在文件中輸入以下代碼: ``` import requests url = \\\'http://www.baidu.com\\\' r = requests.get(url) print(r.text) ``` 上面的代碼中,我們首先導(dǎo)入了 requests 庫(kù),然后聲明了一個(gè)

    2024年02月04日
    瀏覽(18)
  • Python爬蟲|使用Selenium輕松爬取網(wǎng)頁(yè)數(shù)據(jù)

    Python爬蟲|使用Selenium輕松爬取網(wǎng)頁(yè)數(shù)據(jù)

    1. 什么是selenium? Selenium是一個(gè)用于Web應(yīng)用程序自動(dòng)化測(cè)試工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作瀏覽器一樣。支持的瀏覽器包括IE,F(xiàn)irefox,Safari,Chrome等。 Selenium可以驅(qū)動(dòng)瀏覽器自動(dòng)執(zhí)行自定義好的邏輯代碼,也就是可以通過(guò)代碼完全模擬成人類使用

    2024年02月04日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包