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实现从web抓取文档的方法
Sep 26 Python
python计算书页码的统计数字问题实例
Sep 26 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
Python生成器(Generator)详解
Apr 13 Python
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
Python找出9个连续的空闲端口
Feb 01 Python
探究python中open函数的使用
Mar 01 Python
Python实现图片转字符画的示例代码
Aug 21 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
keras 权重保存和权重载入方式
May 21 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五种设计模式小结
2011/03/23 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
Node.js实现文件上传
2016/07/05 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
关于Django外键赋值问题详解
2017/08/13 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
创意婚礼策划方案
2014/05/18 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
公司保洁员管理制度
2015/08/04 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers
TypeScript 内置高级类型编程示例
2022/09/23 Javascript