欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+Selenium實(shí)現(xiàn)短視頻熱點(diǎn)爬取

 更新時(shí)間:2022年04月26日 08:31:50   作者:小六公子  
隨著短視頻的大火,不僅可以給人們帶來娛樂,還有熱點(diǎn)新聞時(shí)事以及各種知識(shí),刷短視頻也逐漸成為了日常生活的一部分。本文將通過Pyhton依托Selenium來爬取短視頻熱點(diǎn),需要的可以參考一下

隨著短視頻的大火,不僅可以給人們帶來娛樂,還有熱點(diǎn)新聞時(shí)事以及各種知識(shí),刷短視頻也逐漸成為了日常生活的一部分。本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何通過Pyhton依托Selenium來爬取短視頻,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。

涉及知識(shí)點(diǎn)

1.selenium,作為瀏覽器端一個(gè)自動(dòng)化測(cè)試工具,可以模擬用戶操作瀏覽器的動(dòng)作,就像是人自己操作瀏覽器一樣。關(guān)于selenium的具體信息如下

  • Selenium進(jìn)行元素定位,主要有ID,Name,ClassName,Css Selector,Partial LinkText,LinkText,XPath,TagName等8種方式。
  • Selenium獲取單一元素(如:find_element)和獲取元素?cái)?shù)組(如:find_elements)兩種方式。
  • Selenium元素定位后,可以給元素進(jìn)行賦值和取值,或者進(jìn)行相應(yīng)的事件操作(如:click)。

2.requests,web請(qǐng)求對(duì)象,通過selenium獲取到視頻的url后,再通過requests庫(kù)進(jìn)行視頻流的獲取,然后保存成本地視頻文件。

3.瀏覽器開發(fā)者工具,通過開發(fā)者工具可以查看頁(yè)面上某一個(gè)按鈕或鏈接等頁(yè)面元素對(duì)應(yīng)的html標(biāo)識(shí)。

目標(biāo)分析

在爬取視頻之前,需要分析目標(biāo)結(jié)構(gòu),本視頻爬取分析可分為三步,具體如下所示:

1. 分析熱榜目錄

熱榜目錄是一個(gè)ul標(biāo)簽,每一個(gè)熱榜對(duì)象一個(gè)li子標(biāo)簽,分別包含熱度,標(biāo)題等內(nèi)容。點(diǎn)擊標(biāo)題鏈接可以進(jìn)入具體視頻播放頁(yè)面,目標(biāo)分析如下所示:

2.分析視頻播放頁(yè)面

視頻在video標(biāo)簽中播放,短視頻播放的真實(shí)地址,在video的source子標(biāo)簽中,且為了保證播放質(zhì)量,video下有三個(gè)source,任取其一即可,如下所示:

3. 分析彈出框

在爬取過程中,經(jīng)過彈出需要登錄的窗口,需要及時(shí)關(guān)閉掉,否則可能會(huì)導(dǎo)致找不到頁(yè)面元素,從而爬取不成功。如下所示:

核心代碼

經(jīng)過以上分析,就可以編寫爬蟲代碼了,如下所示:

1. 遍歷熱點(diǎn)目錄

通過獲取頁(yè)面上對(duì)應(yīng)的信息,解析出熱點(diǎn)視頻的目錄,如下所示:

self.__driver.get(self.__url)
self.close_popup_window()
# 4. 最大化窗口
self.__driver.maximize_window()
time.sleep(self.__wait_sec)
# 打開以后,根據(jù)class=BHgRhxNh獲取ul下的li
if self.checkIsExistsByClass(cls='BHgRhxNh'):
    # 獲取
    hots = self.__driver.find_elements(by=By.CLASS_NAME, value='BHgRhxNh')
    hot_infos = []
    index = 0
    for hot in hots:
        hot_info = {}
        a = hot.find_element(by=By.TAG_NAME, value='a')
        href = a.get_attribute("href")
        text = a.text
        hot_info['url'] = href
        hot_info['text'] = text
        if index > 0:
            div = hot.find_element(by=By.CLASS_NAME, value='GsuT_hjh')
            if div is not None:
                hot_value = div.find_element(by=By.TAG_NAME, value='span').text
                hot_info['value'] = hot_value
        hot_infos.append(hot_info)
        index = index + 1
    print(hot_infos)

2. 獲取真實(shí)短視頻url

打開單個(gè)熱點(diǎn)視頻的url,并解析真實(shí)短視頻播放url,如下所示:

def open_video_html(self, url):
    """打開具體視頻的頁(yè)面"""
    self.__driver.get(url=url)
    time.sleep(1)
    self.close_popup_window()  # 關(guān)閉彈窗
    video = self.__driver.find_element(by=By.TAG_NAME, value='video')
    source = video.find_element(by=By.TAG_NAME, value='source')
    src = source.get_attribute('src')
    return src

3. 下載視頻

獲取真實(shí)的url后,即可進(jìn)行下載,如下所示:

def download_video(self, url, video_name):
    """根據(jù)視頻源地址進(jìn)行下載"""
    if os.path.exists(video_name):
        # 如果已重新下載過,則不需要再次下載
        return
    else:
        with open(video_name, 'wb') as fp:
            fp.write(requests.get(url).content)

4. 關(guān)閉彈出的登錄窗口

在爬取過程中,經(jīng)常彈出需要登錄的遮罩窗口,需要進(jìn)行關(guān)閉,如下所示:

def close_popup_window(self):
    try:
        login = self.__driver.find_element(by=By.ID, value='login-pannel')
        if login is not None:
            login.find_element(by=By.CLASS_NAME, value='dy-account-close').click()
    except BaseException as e:
        pass
    try:
        login = self.__driver.find_element(by=By.CLASS_NAME, value='GaDkStRD')
        if login is not None:
            btns = login.find_elements(by=By.TAG_NAME, value='button')
            for btn in btns:
                if btn.text == '取消':
                    btn.click()
                    break
    except BaseException as e:
        pass

5. 保存日志

在爬取成功后,對(duì)爬取的短視頻的相關(guān)內(nèi)容進(jìn)行保存,如下所示:

def save_data(self, hot_infos):
    """
    保存數(shù)據(jù)
    :param res_list: 保存的內(nèi)容文件
    :return:
    """
    t = time.strftime("%Y-%m-%d", time.localtime())
    with open(f'logs[{t}].json', 'a', encoding='utf-8') as f:
        res_list_json = json.dumps(hot_infos, ensure_ascii=False)
        f.write(res_list_json)

示例截圖

程序開發(fā)完成后,運(yùn)行示例如下所示:

爬取的視頻保存在download目錄下,如下所示:

總結(jié)

 為什么會(huì)采用selenium進(jìn)行本次短視頻的爬取,而不直接采用requests庫(kù),原因如下:

  • 在對(duì)目標(biāo)網(wǎng)站進(jìn)行分析的過程中,發(fā)現(xiàn)目標(biāo)網(wǎng)站采用異步調(diào)用的方式數(shù)據(jù)獲取,即網(wǎng)址請(qǐng)求獲取的只是空殼,并沒有真實(shí)的數(shù)據(jù)。
  • 在對(duì)異步接口調(diào)用的url進(jìn)行分析時(shí)發(fā)現(xiàn),很多接口的url都具有時(shí)效性及有效性驗(yàn)證,如token,時(shí)間戳等,構(gòu)造起來相當(dāng)麻煩。

由于以上兩點(diǎn)原因,結(jié)合selenium的特點(diǎn)及優(yōu)勢(shì),所以最終采用selenium進(jìn)行此次爬蟲的最佳選擇。

以上就是Python+Selenium實(shí)現(xiàn)短視頻熱點(diǎn)爬取的詳細(xì)內(nèi)容,更多關(guān)于Python Selenium熱點(diǎn)爬取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 部署Django到阿里云服務(wù)器教程示例

    部署Django到阿里云服務(wù)器教程示例

    這篇文章主要介紹了部署Django到阿里云服務(wù)器教程示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python函數(shù)的返回值、匿名函數(shù)lambda、filter函數(shù)、map函數(shù)、reduce函數(shù)用法實(shí)例分析

    Python函數(shù)的返回值、匿名函數(shù)lambda、filter函數(shù)、map函數(shù)、reduce函數(shù)用法實(shí)例分析

    這篇文章主要介紹了Python函數(shù)的返回值、匿名函數(shù)lambda、filter函數(shù)、map函數(shù)、reduce函數(shù)用法,結(jié)合實(shí)例形式分析了Python函數(shù)的返回值、匿名函數(shù)lambda、filter函數(shù)、map函數(shù)、reduce函數(shù)相關(guān)功能、原理與使用技巧,需要的朋友可以參考下
    2019-12-12
  • Python批處理刪除和重命名文件夾的實(shí)例

    Python批處理刪除和重命名文件夾的實(shí)例

    今天小編就為大家分享一篇Python批處理刪除和重命名文件夾的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python中os模塊的使用及文件對(duì)象的讀寫詳解

    Python中os模塊的使用及文件對(duì)象的讀寫詳解

    這篇文章主要介紹了Python中os模塊的使用及文件對(duì)象的讀寫詳解,Python?open()?方法用于打開一個(gè)文件,并創(chuàng)建返回文件對(duì)象,在對(duì)文件進(jìn)行處理過程都需要使用到這個(gè)函數(shù),如果該文件無法被打開,會(huì)拋出?OSError,需要的朋友可以參考下
    2023-08-08
  • numpy中的transpose函數(shù)中具體使用方法

    numpy中的transpose函數(shù)中具體使用方法

    本文主要介紹了numpy中的transpose函數(shù)中具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python?序列去重并保持原始順序操作

    python?序列去重并保持原始順序操作

    這篇文章主要介紹了python序列去重并保持原始順序操作,文章圍繞了python?序列去重的相關(guān)資料展開詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你的有所幫助
    2022-03-03
  • 一文帶你搞懂Python中的文件操作

    一文帶你搞懂Python中的文件操作

    這篇文章主要為大家詳細(xì)介紹了Python中常見的文件操作的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下
    2022-11-11
  • tensorflow 加載部分變量的實(shí)例講解

    tensorflow 加載部分變量的實(shí)例講解

    今天小編就為大家分享一篇tensorflow 加載部分變量的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python中的deque雙向隊(duì)列詳解

    python中的deque雙向隊(duì)列詳解

    這篇文章主要介紹了python中的deque雙向隊(duì)列詳解,相比 list 實(shí)現(xiàn)的隊(duì)列,deque 擁有更低的時(shí)間和空間復(fù)雜度,list 實(shí)現(xiàn)在出隊(duì)(pop)和插入(insert)時(shí)的空間復(fù)雜度大約為O(n),需要的朋友可以參考下
    2023-09-09
  • python算的上腳本語(yǔ)言嗎

    python算的上腳本語(yǔ)言嗎

    在本篇內(nèi)容中小編給大家分享的是關(guān)于python是否屬于腳本語(yǔ)言的相關(guān)內(nèi)容知識(shí)點(diǎn),有興趣的朋友們可以參考下。
    2020-06-06

最新評(píng)論