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 import自定义模块方法
Feb 12 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
详解python中的 is 操作符
Dec 26 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
Django对models里的objects的使用详解
Aug 17 Python
Python的几种主动结束程序方式
Nov 22 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 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
php mail to 配置详解
2014/01/16 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
Angular5中状态管理的实现
2018/09/03 Javascript
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
python实现封装得到virustotal扫描结果
2014/10/05 Python
深入讲解Python编程中的字符串
2015/10/14 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
详解django中自定义标签和过滤器
2017/07/03 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
Python解析json代码实例解析
2019/11/25 Python
PyTorch的torch.cat用法
2020/06/28 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
英语专业个人求职自荐信
2013/09/21 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
Python字典和列表性能之间的比较
2021/06/07 Python
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS
Python进程间的通信之语法学习
2022/04/11 Python
Golang流模式之grpc的四种数据流
2022/04/13 Golang