Python爬取某短視頻熱點

来源:https://www.cnblogs.com/hsiang/archive/2022/04/26/16192686.html
-Advertisement-
Play Games

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


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

涉及知識點

  • selenium,作為瀏覽器端一個自動化測試工具,可以模擬用戶操作瀏覽器的動作,就像是人自己操作瀏覽器一樣。關於selenium的具體信息如下
    • Selenium進行元素定位,主要有ID,Name,ClassName,Css Selector,Partial LinkText,LinkText,XPath,TagName等8種方式。
    • Selenium獲取單一元素(如:find_element)和獲取元素數組(如:find_elements)兩種方式。
    • Selenium元素定位後,可以給元素進行賦值和取值,或者進行相應的事件操作(如:click)。
  • requests,web請求對象,通過selenium獲取到視頻的url後,再通過requests庫進行視頻流的獲取,然後保存成本地視頻文件。
  • 瀏覽器開發者工具,通過開發者工具可以查看頁面上某一個按鈕或鏈接等頁面元素對應的html標識。

目標分析

在爬取視頻之前,需要分析目標結構,本視頻爬取分析可分為三步,具體如下所示:

1. 分析熱榜目錄

熱榜目錄是一個ul標簽,每一個熱榜對象一個li子標簽,分別包含熱度,標題等內容。點擊標題鏈接可以進入具體視頻播放頁面,目標分析如下所示:

 

2.分析視頻播放頁面

 視頻在video標簽中播放,短視頻播放的真實地址,在video的source子標簽中,且為了保證播放質量,video下有三個source,任取其一即可,如下所示:

 

 3. 分析彈出框

在爬取過程中,經過彈出需要登錄的視窗,需要及時關閉掉,否則可能會導致找不到頁面元素,從而爬取不成功。如下所示:

 

核心代碼

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

1. 遍歷熱點目錄

通過獲取頁面上對應的信息,解析出熱點視頻的目錄,如下所示:

 1 self.__driver.get(self.__url)
 2 self.close_popup_window()
 3 # 4. 最大化視窗
 4 self.__driver.maximize_window()
 5 time.sleep(self.__wait_sec)
 6 # 打開以後,根據class=BHgRhxNh獲取ul下的li
 7 if self.checkIsExistsByClass(cls='BHgRhxNh'):
 8     # 獲取
 9     hots = self.__driver.find_elements(by=By.CLASS_NAME, value='BHgRhxNh')
10     hot_infos = []
11     index = 0
12     for hot in hots:
13         hot_info = {}
14         a = hot.find_element(by=By.TAG_NAME, value='a')
15         href = a.get_attribute("href")
16         text = a.text
17         hot_info['url'] = href
18         hot_info['text'] = text
19         if index > 0:
20             div = hot.find_element(by=By.CLASS_NAME, value='GsuT_hjh')
21             if div is not None:
22                 hot_value = div.find_element(by=By.TAG_NAME, value='span').text
23                 hot_info['value'] = hot_value
24         hot_infos.append(hot_info)
25         index = index + 1
26     print(hot_infos)

2. 獲取真實短視頻url

打開單個熱點視頻的url,並解析真實短視頻播放url,如下所示:

1 def open_video_html(self, url):
2     """打開具體視頻的頁面"""
3     self.__driver.get(url=url)
4     time.sleep(1)
5     self.close_popup_window()  # 關閉彈窗
6     video = self.__driver.find_element(by=By.TAG_NAME, value='video')
7     source = video.find_element(by=By.TAG_NAME, value='source')
8     src = source.get_attribute('src')
9     return src

3. 下載視頻

獲取真實的url後,即可進行下載,如下所示:

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

4. 關閉彈出的登錄視窗

在爬取過程中,經常彈出需要登錄的遮罩視窗,需要進行關閉,如下所示:

 1 def close_popup_window(self):
 2     try:
 3         login = self.__driver.find_element(by=By.ID, value='login-pannel')
 4         if login is not None:
 5             login.find_element(by=By.CLASS_NAME, value='dy-account-close').click()
 6     except BaseException as e:
 7         pass
 8     try:
 9         login = self.__driver.find_element(by=By.CLASS_NAME, value='GaDkStRD')
10         if login is not None:
11             btns = login.find_elements(by=By.TAG_NAME, value='button')
12             for btn in btns:
13                 if btn.text == '取消':
14                     btn.click()
15                     break
16     except BaseException as e:
17         pass

5. 保存日誌

在爬取成功後,對爬取的短視頻的相關內容進行保存,如下所示:

 1 def save_data(self, hot_infos):
 2     """
 3     保存數據
 4     :param res_list: 保存的內容文件
 5     :return:
 6     """
 7     t = time.strftime("%Y-%m-%d", time.localtime())
 8     with open(f'logs[{t}].json', 'a', encoding='utf-8') as f:
 9         res_list_json = json.dumps(hot_infos, ensure_ascii=False)
10         f.write(res_list_json)

示例截圖

程式開發完成後,運行示例如下所示:

 

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

 

總結

 為什麼會採用selenium進行本次短視頻的爬取,而不直接採用requests庫,原因如下:

  1. 在對目標網站進行分析的過程中,發現目標網站採用非同步調用的方式數據獲取,即網址請求獲取的只是空殼,並沒有真實的數據。
  2. 在對非同步介面調用的url進行分析時發現,很多介面的url都具有時效性及有效性驗證,如token,時間戳等,構造起來相當麻煩。

由於以上兩點原因,結合selenium的特點及優勢,所以最終採用selenium進行此次爬蟲的最佳選擇。

備註

以上就是本次爬取短視頻的全部內容,僅供學習分享使用,不足之處,還請指正。

菩薩蠻·書江西造口壁【作者】辛棄疾 【朝代】宋

鬱孤臺下清江水,中間多少行人淚?西北望長安,可憐無數山。

青山遮不住,畢竟東流去。江晚正愁餘,山深聞鷓鴣。


作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前段時間在Android原生搞的BLE掃碼槍又要移植到小程式上來。本以為小程式不支持BLE的,結果一搜,還真支持-_-|| 。 藍牙部分問題不大,遇到的主要問題是,小程式環境如何對字元編碼進行判斷以及如何進行編碼轉文字的問題。 掃了一陣,搜到了TextDecoder。結果小程式環境不支持……。 隨後 ...
  • 解釋器模式是什麼 解釋器是一種行為型設計模式,指給分析對象定義一個語言,並定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的實例。這種模式實現了文法表達式處理的介面,該介面解釋一個特定的上下文。 為什麼用解釋器模式 在軟體開發中,會遇到有些問題多次重覆 ...
  • 訪問者模式是什麼 訪問者是一種行為型設計模式, 允許你在不修改已有代碼的情況下向已有類層次結構中增加新的行為。 為什麼用訪問者模式 訪問者模式建議將新行為放入一個名為訪問者的獨立類中,而不是試圖將其整合到已有類中。現在需要執行操作的原始對象將作為參數被傳遞給訪問者中的方法, 讓方法能訪問對象所包含的 ...
  • 有了《系統架構的11條原則》,真正到設計階段還有另外11個考慮。 系統正確性 考慮一:負負得正 假如我們看到某個代碼,明顯有邏輯錯誤,想隨手改改。你就要考慮一件事情:這段明顯有問題的代碼為什麼線上上運行著沒有人來報bug?有一種正常運行叫做【負負得正】。如果把錯誤的邏輯改對了反而可能引起問題。 這種 ...
  • 組織管理模塊屬於SaaS產品非常底層的架構,非常考驗架構能力,幾乎所有的業務場景都需要應用組織數據,背後反應的是企業決策層的經營戰略和財務戰略,因此需要掌握一定的企業管理知識和財務知識,如果能夠掌握組織管理的概念和要點,對設計好SaaS產品幫助巨大。 ...
  • 如果軟體系統存在持續的迭代周期,那麼其中業務、技術、架構的複雜性都會直線拉升,其相應的開發難度也會提高,隨之而來的壓力會持續在開發和測試之間來回橫跳。 ...
  • 鑒於上一篇中最後三個問題: 1、上述程式是否能進行優化(比如功能相同的) 2、創建三個3個實例,用了3個語句,能否建一個函數,只輸入一個數n,就自動創建n個實例?同時,每個實例的num_times隨機,(n比較大時,num_times應該比較小) 3、當實現上述功能後,程式運行,只輸入一個參數(創建 ...
  • L1-081 今天我要贏 #include <iostream> using namespace std; int main() { cout << "I'm gonna win! Today!\n2022-04-23"; } 2018 年我們曾經出過一題,是輸出“2018 我們要贏”。今年是 20 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...