Python+Selenium實(shí)現(xiàn)短視頻熱點(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)文章
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-12numpy中的transpose函數(shù)中具體使用方法
本文主要介紹了numpy中的transpose函數(shù)中具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02