本篇內容介紹了“Python+Selenium怎么實現短視頻熱點爬取”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1.selenium,作為瀏覽器端一個自動化測試工具,可以模擬用戶操作瀏覽器的動作,就像是人自己操作瀏覽器一樣。關于selenium的具體信息如下
Selenium進行元素定位,主要有ID,Name,ClassName,Css Selector,Partial LinkText,LinkText,XPath,TagName等8種方式。
Selenium獲取單一元素(如:find_element)和獲取元素數組(如:find_elements)兩種方式。
Selenium元素定位后,可以給元素進行賦值和取值,或者進行相應的事件操作(如:click)。
2.requests,web請求對象,通過selenium獲取到視頻的url后,再通過requests庫進行視頻流的獲取,然后保存成本地視頻文件。
3.瀏覽器開發者工具,通過開發者工具可以查看頁面上某一個按鈕或鏈接等頁面元素對應的html標識。
在爬取視頻之前,需要分析目標結構,本視頻爬取分析可分為三步,具體如下所示:
熱榜目錄是一個ul標簽,每一個熱榜對象一個li子標簽,分別包含熱度,標題等內容。點擊標題鏈接可以進入具體視頻播放頁面,目標分析如下所示:
視頻在video標簽中播放,短視頻播放的真實地址,在video的source子標簽中,且為了保證播放質量,video下有三個source,任取其一即可,如下所示:
在爬取過程中,經過彈出需要登錄的窗口,需要及時關閉掉,否則可能會導致找不到頁面元素,從而爬取不成功。如下所示:
經過以上分析,就可以編寫爬蟲代碼了,如下所示:
通過獲取頁面上對應的信息,解析出熱點視頻的目錄,如下所示:
self.__driver.get(self.__url) self.close_popup_window() # 4. 最大化窗口 self.__driver.maximize_window() time.sleep(self.__wait_sec) # 打開以后,根據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)
打開單個熱點視頻的url,并解析真實短視頻播放url,如下所示:
def open_video_html(self, url): """打開具體視頻的頁面""" self.__driver.get(url=url) time.sleep(1) self.close_popup_window() # 關閉彈窗 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
獲取真實的url后,即可進行下載,如下所示:
def download_video(self, url, video_name): """根據視頻源地址進行下載""" if os.path.exists(video_name): # 如果已重新下載過,則不需要再次下載 return else: with open(video_name, 'wb') as fp: fp.write(requests.get(url).content)
在爬取過程中,經常彈出需要登錄的遮罩窗口,需要進行關閉,如下所示:
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
在爬取成功后,對爬取的短視頻的相關內容進行保存,如下所示:
def save_data(self, hot_infos): """ 保存數據 :param res_list: 保存的內容文件 :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)
程序開發完成后,運行示例如下所示:
爬取的視頻保存在download目錄下,如下所示:
“Python+Selenium怎么實現短視頻熱點爬取”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。