python動態視頻下載器

来源:https://www.cnblogs.com/ITXiaoAng/archive/2019/09/16/11524648.html
-Advertisement-
Play Games

這裡向大家分享一下python爬蟲的一些應用,主要是用爬蟲配合簡單的GUI界面實現視頻,音樂和小說的下載器。今天就先介紹如何實現一個動態視頻下載器。 爬取電影天堂視頻 首先介紹的是python爬取電影天堂網站的視頻(包括電影,電視劇,綜藝等),主要是用selenium動態網頁技術加上簡單的爬蟲技術。 ...


這裡向大家分享一下python爬蟲的一些應用,主要是用爬蟲配合簡單的GUI界面實現視頻,音樂和小說的下載器。今天就先介紹如何實現一個動態視頻下載器。

 

爬取電影天堂視頻

首先介紹的是python爬取電影天堂網站的視頻(包括電影,電視劇,綜藝等),主要是用selenium動態網頁技術加上簡單的爬蟲技術。

(1)電影網站首頁面地址:https://www.dytt8.net/

(2)用到的技術:selenium模擬瀏覽器運行。

(3)首先要安裝配置selenium庫和不同瀏覽器和該庫配合的插件。這裡安裝配置的過程略過。

(4)然後我們用下麵的代碼打開首頁,並輸出該網頁的源碼:

def getSource(url):
    browser = webdriver.Chrome()
    browser.get(url)
    print(browser.page_source)
    browser.close()

(5)然後我們找到搜索對應的網頁元素標簽,以及選擇類型和立即搜索按鈕對應的標簽。

分別為:

 

(6)然後我們用下麵的代碼把用戶輸入的信息模擬放到瀏覽器上

  由於未載入完畢會進入廣告頁面,因此有需要改進的地方,這時就需要延長載入時間。這裡有顯示等待和隱式等待,用簡單的隱式等待即可。

       有時候會出現錯誤,因為掩蓋的div可能會在進行一些操作後,會消失,比如頁面還在loading中。這時候點擊元素的話,就直接點擊在loading的標簽上,所以在這個操作前可以加個等待,讓掩蓋的div自行消失後,再等待左側菜單到可點擊狀態即可;或者進行刷新的操作,此div即可消失,再等待左側菜單到可點擊狀態即可。

代碼為:

def putUserMessger(url,this_name,this_type):
    '''
    :param url: 瀏覽器網址
    :param this_name: 需要下載的視頻名
    :param this_type: 需要下載的視頻類型
    '''
    this_browser = webdriver.Chrome()
    this_browser.implicitly_wait(10)
    this_browser.get(url)
    # 把下載的視頻名和視頻類型進行模擬瀏覽器匹配
    # 搜索輸入框的標簽屬性有name和class,這裡用name屬性進行獲取
    this_browser.find_element_by_name('keyword').send_keys(this_name)
    time.sleep(2)
    # 選擇類型下拉框是html自帶的下拉框,不是input做的假的下拉框
    Select(this_browser.find_element_by_name('field')).select_by_visible_text(this_type)
    time.sleep(2)
    # 點擊立即搜索按鈕,submit就不是單純的單擊,它會涉及到前後臺的交互
    this_browser.find_element_by_name('Submit').click()
    this_browser.close()


def main():
    name = input('請輸入視頻名:')
    type = input('請選擇類型:')
    url = 'https://www.dytt8.net/'
    putUserMessger(url,name,type)

  但是還是會出現下麵的問題:

selenium.common.exceptions.WebDriverException: Message: unknown error: Element <input name="Submit" type="Submit" value="立即搜索"> is not clickable at point (702, 220). Other element would receive the click: <div style="width: 1017px; height: 577px;"></div>
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17134 x86_64)

但是我們發現我們點擊後的其實是有規律的,因此用另一個方法。

(6)二層頁面配置參數及視頻三層地址輸出

我們先分析一下url:

分析第二層頁面地址為:

http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%C4%E3%B5%C4%C3%FB%D7%D6

是由http://s.ygdy8.com/plus/so.php?+typeid=視頻編號&keyword=視頻名gdk編碼組成。因此需要先轉化漢字為網頁地址url的編碼。

用下麵的代碼就可以構建一個需要的網址:

def main():
    name = input('請輸入視頻名:')
    type = input('請選擇類型:')
    ret = quote(name, encoding="gbk")
    dict = {'電影':'1','電視劇':'2','綜藝':'99','舊綜藝':'89','游戲':'19','動漫':'16'}
    url = 'http://s.ygdy8.com/plus/so.php?' + 'typeid=' + dict[type] + '&keyword=' + ret

然後我們分析一下網頁:

輸出所有的視頻信息和三級地址:

def putUserMessger(url):
    '''
    :param url: 視頻網址
    '''
    this_browser = webdriver.Chrome()
    this_browser.get(url)
    # 用css選擇器選擇
    input1 = this_browser.find_elements_by_css_selector('.co_content8 ul td a')
    for i in input1:
        print(i.text)
        print(i.get_attribute('href'))
    this_browser.close()

(7)三級網頁找到下載界面

下載的鏈接的位置是:

然後用request配合pyquery下載即可。

下載鏈接如下:

(8)完整代碼

這裡沒有用到資料庫,上面的代碼再配合界面,這裡只暫時沒有界面的代碼如下:

# encoding: utf-8
from selenium import webdriver
from urllib.request import quote
import requests
from pyquery import PyQuery as pq
from tkinter import *


def putUserMessger(url):
    '''
    :param url: 視頻網址
    '''
    last_url = {}
    this_browser = webdriver.Chrome()
    this_browser.get(url)
    # 用css選擇器選擇
    input1 = this_browser.find_elements_by_css_selector('.co_content8 ul td a')
    for i in input1:
        #用字典保存視頻的名字與下載地址
        last_url[i.text] = i.get_attribute('href')
    this_browser.close()
    return last_url


def download(all_url):
    this_download = {}
    for name,url in dict.items(all_url):
        r = requests.get(url)
        r.encoding = r.apparent_encoding
        doc = pq(r.text)
        this_url = doc('#Zoom a')
        this_download[name] = this_url.attr('href')
    return this_download



type = 0
name = 0

def myRadiobutton():
    global type
    type = v.get()


def my_all():
    name = var.get()
    ret = quote(name, encoding="gbk")
    url = 'http://s.ygdy8.com/plus/so.php?' + 'typeid=' + str(type) + '&keyword=' + ret
    all_url = putUserMessger(url)
    result = download(all_url)
    print(result)


# 創建一個主視窗,用於容納整個GUI程式
root = Tk()
# 設置主視窗對象的標題欄
root.title("視頻下載器")
L1 = Label(root, text="請選擇類型:")
L1.pack(side = TOP)
v = IntVar()
Radiobutton(root, text='電影', variable=v, command=myRadiobutton,value=1).pack(anchor=W)
Radiobutton(root, text='電視劇', variable=v, command=myRadiobutton,value=2).pack(anchor=W)
Radiobutton(root, text='綜藝', variable=v, command=myRadiobutton,value=99).pack(anchor=W)
Radiobutton(root, text='舊綜藝', variable=v, command=myRadiobutton,value=89).pack(anchor=W)
Radiobutton(root, text='游戲', variable=v, command=myRadiobutton,value=19).pack(anchor=W)
Radiobutton(root, text='動漫', variable=v, command=myRadiobutton,value=16).pack(anchor=W)

var = StringVar()
L2 = Label(root, text="請輸入視頻名")
L2.pack(side = LEFT)
E1 = Entry(root, bd=5,textvariable=var)
E1.pack(side = RIGHT)

B = Button(root, text="點我",command=my_all).place(x=120, y=80)
# 顯示界面,進入主事件迴圈
root.mainloop()

結果如下:

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 vue通信手段有很多種,props/emit、vuex、event bus、provide/inject 等。還有一種通信方式,那就是 $attrs 和 $listeners,之前早就聽說這兩個api,趁著有空來補補。這種方式挺優雅,使用起來也不賴。下麵例子都會通過父、子、孫子,三者的關係來說 ...
  • [TOC] 1.DOM樹介紹 DOM:文檔對象模型。DOM 為文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。目的其實就是為了能讓js操作html元素而制定的一個規範。 DOM就是由節點組成的:HTML載入完畢,渲染引擎會在記憶體中把HTML文檔,生成一個DOM樹。 在HTML當中,一切都是 ...
  • 一、使用方法: 因為map標簽是與img標簽綁定使用的,所以我們需要給map標簽添加ID和name屬性,讓img標簽中的usemap屬性引用map標簽中的id或者name屬性(由於瀏覽器的不同,usemap屬性接收二者之一的值,所以通常name和id屬性二者都寫,值相同),並配合area標簽進行使用 ...
  • [TOC] 1.javascript介紹 1.1Web前端有三層: HTML:從語義的角度,描述頁面 結構 CSS:從審美的角度,描述 樣式 (美化頁面) JavaScript:從交互的角度,描述 行為 (提升用戶體驗) 1.2其中JavaScript基礎又分為三個部分: ECMAScript:Ja ...
  • 介紹 前文初始篇 "C++ 深入淺出工廠模式(初始篇)" ,主要闡述了簡單工廠模式、工廠方法模式和抽象工廠模式的結構、特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。 本文進階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工 ...
  • 倒排索引架構 在廣告系統中倒排索引起著至關重要的作用,當請求過來時,需要根據定向信息從倒排索引中匹配合適的廣告。我們的倒排索引採用的是ElasticSearch(後面簡稱ES),考慮點是社區活躍,相關採集、可視化、監控以及報警等組件比較完善,同時ES基於java開發,所以調優和二次開發相對方便 先看 ...
  • 關鍵字&標識符 關鍵字的概念與特征 概念:Java關鍵字是事先定義好的對Java的編譯器有特殊的意義,他們用來表示一種數據類型,或者表示程式的結構等,關鍵字不能用作變數名、方法名、類名、包名和參數。 特征: 完全小寫 在增強版記事本中(例如Notepad++)有特殊顏色 標識符的概念與規則 凡是可以 ...
  • 下麵繼續給出HDU 2033~2043的AC程式,供大家參考。2033~2043這10道題就被歸結為“ACM程式設計期末考試(2006/06/07) ”和“2005實驗班短學期考試 ”。 HDU 2033:人見人愛A+B 簡單分支結構。 #include <stdio.h> int main() { ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...