python动态视频下载器的实现方法


Posted in Python onSeptember 16, 2019

这里向大家分享一下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)然后我们找到搜索对应的网页元素标签,以及选择类型和立即搜索按钮对应的标签。

python动态视频下载器的实现方法

分别为:

python动态视频下载器的实现方法

python动态视频下载器的实现方法

python动态视频下载器的实现方法

(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:
python动态视频下载器的实现方法

分析第二层页面地址为:

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

然后我们分析一下网页:

python动态视频下载器的实现方法

python动态视频下载器的实现方法

输出所有的视频信息和三级地址:

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()

python动态视频下载器的实现方法

(7)三级网页找到下载界面

下载的链接的位置是:

python动态视频下载器的实现方法

然后用request配合pyquery下载即可。

下载链接如下:

python动态视频下载器的实现方法

python动态视频下载器的实现方法

(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()

结果如下:

python动态视频下载器的实现方法

python动态视频下载器的实现方法

python动态视频下载器的实现方法

总结

以上所述是小编给大家介绍的python动态视频下载器的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python用来获得图片exif信息的库实例分析
Mar 16 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
使用Python对Csv文件操作实例代码
May 12 Python
浅述python2与python3的简单区别
Sep 19 Python
python基础梳理(一)(推荐)
Apr 06 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
Python range与enumerate函数区别解析
Feb 28 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python StringIO及BytesIO包使用方法解析
Jun 15 Python
深入了解Python 方法之类方法 &amp; 静态方法
Aug 17 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
python tkinter基本属性详解
Sep 16 #Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 #Python
django中使用事务及接入支付宝支付功能
Sep 15 #Python
Django中的FBV和CBV用法详解
Sep 15 #Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 #Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 #Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 #Python
You might like
基于mysql的论坛(2)
2006/10/09 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
PHP7 弃用功能
2021/03/09 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
快速入手Python字符编码
2016/08/03 Python
python实现停车管理系统
2018/11/30 Python
Python 互换字典的键值对实例
2019/02/12 Python
python脚本开机自启的实现方法
2019/06/28 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
python内存动态分配过程详解
2019/07/15 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
从python读取sql的实例方法
2020/07/21 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
大学生的自我鉴定范文
2014/01/21 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
员工薪酬激励方案
2014/06/13 职场文书