近期,《哪吒之魔童降世》在各大视频软件可以看了,然而却是一贯的套路,非会员谢绝观看!!!只能从国内那些五花八门的视频网站上找着看了,或者通过之前本人说的 Chrome 的油猴插件,传送门 https://www.cnblogs.com/weijiutao/p/10608107.html,进行观看。

经过分析,通过油猴插件观看某奇艺等主流视频网站的方法其实就是在视频网页链接的前面加上一个视频解析的链接地址,如下:

播放传送门

http://jx.618g.com/?url=http://www.iqiyi.com/lib/m_217405614.html?src=search

http://www.iqiyi.com/lib/m_217405614.html?src=search

通过上面的分析,本人萌生了一个将 Tampermonkey 和 主流视频网站 联系起来的一个小工具,通过自己输入想要观看的视频,然后通过油猴插件里面的视频解析网站解析出来,效果如下:

首先我们要做的就是从某奇艺等网站上获取到我们想要的视频信息,如海报,电影名,演员,导演,简介和播放链接等信息。

本人选用了 Python 语言开发,结合 Tornado 框架将想要的信息呈现到 web 页面上。目录结构如下:

项目的主入口为 app.py ,代码如下:

 import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import os import spider.tv.tencent
import spider.tv.aiqiyi import spider.movie.tencent
import spider.movie.aiqiyi import spider.variety.tencent
import spider.variety.aiqiyi from tornado.options import options
from tornado.web import RequestHandler, StaticFileHandler tornado.options.define("port", type=int, default=8000, help="服务器端口") class IndexHandler(RequestHandler): # 主页处理类
def get(self):
self.render("index.html") def post(self):
self.render("index.html") class TvpalyHandler(RequestHandler):
def post(self):
name = self.get_argument("name")
type = self.get_argument("type")
if type == '':
resultTencent = spider.tv.tencent.tencents(self, name)
resultAiqiyi = spider.tv.aiqiyi.aiqiyi(self, name)
data = {
"tencent": resultTencent,
"aiqiyi": resultAiqiyi,
}
self.write(data)
elif type == '':
resultTencent = spider.movie.tencent.tencents(self, name)
resultAiqiyi = spider.movie.aiqiyi.aiqiyi(self, name)
data = {
"tencent": resultTencent,
"aiqiyi": resultAiqiyi,
}
self.write(data)
elif type == '':
resultTencent = spider.variety.tencent.tencents(self, name)
resultAiqiyi = spider.variety.aiqiyi.aiqiyi(self, name)
data = {
"tencent": resultTencent,
"aiqiyi": resultAiqiyi,
}
self.write(data) if __name__ == '__main__':
tornado.options.parse_command_line()
current_path = os.path.dirname(__file__)
app = tornado.web.Application(
[ (r'/', IndexHandler),
(r'/api/tvplay', TvpalyHandler),
(r'/(.*)', StaticFileHandler, {
"path": os.path.join(current_path, "statics/html"),
"default_filename": "index.html"
}),
],
static_path=os.path.join(current_path, "static"),
template_path=os.path.join(current_path, "template"),
debug=True,
autoescape=None
) http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()

由于本人没有经过系统的 Python 学习,完全都是自学而来,所以代码中如有什么不妥之处请大神批评指正。

在上面的代码中,我们做的内容其实是接收前端发来的 POST 请求,并通过 type 类型去目录 spider 中调用不同类型的内容(电影,电视剧,综艺),上面我们在 web 页面搜索 哪吒 其实就是 type == 2 时所要做的处理,即调用目录 spider->movie 下的 aiqiyi.py 和 tencent.py,由于某酷的web页面全是动态js加载的,内容不好做处理,这里就忽略了。

我们以 aiqiyi.py 为例,tencent.py 代码其实大同小异,思路一样。代码如下:

 from urllib import request, parse
from lxml import etree
import ssl # 取消 https 代理验证
ssl._create_default_https_context = ssl._create_unverified_context def aiqiyi(self, name):
# 报头
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
headers = {'User-Agent': user_agent}
url = "https://so.iqiyi.com/so/q_" + parse.quote(name)
req = request.Request(url, headers=headers)
try:
response = request.urlopen(req)
# 获取每页的HTML源码字符串
html = response.read().decode('utf-8')
# 解析html 为 HTML 文档
selector = etree.HTML(html) # 来源
source = "爱奇艺视频" # 剧照
pic = 'https:' + \
selector.xpath('//ul[@class="mod_result_list"]/li[1]/a//img/@src')[0] # 导演
director = selector.xpath(
"//ul[@class='mod_result_list']/li[1]//div[@class='info_item'][1]/div[@class='result_info_cont result_info_cont-half'][1]/a[@class='result_info_link']/text()")
# 主演
actor = selector.xpath(
"//ul[@class='mod_result_list']/li[1]//div[@class='info_item'][1]/div[@class='result_info_cont result_info_cont-half'][2]/a[@class='result_info_link']/text()") # 简介
desc = selector.xpath(
"//ul[@class='mod_result_list']/li[@class='list_item'][1]//div[@class='info_item'][2]//span[@class='result_info_txt']/text()")[
0] # 链接
link = selector.xpath('//ul[@class="mod_result_list"]/li[1]/a/@href')[0]
defalut_result = {
"source": source,
"name": name,
"pic": pic,
"director": director,
"actor": actor,
"desc": desc,
"list": [{'title': '播放', 'link': link}]
}
return defalut_result
except Exception:
print(url, Exception)
data = {"code": -1, "message": "error", "data": None}
return data

我们要解析的页面其实是 'https://so.iqiyi.com/so/q_' + 要搜索的内容,如下图所示:

然后我们就可以通过 python 爬虫来抓取页面中的内容信息了,从上面的页面截图可以发现我们输入的搜索字其实搜索到了一些其他的信息,这些信息在提取过程中会出现很多复杂情况,所以再这里本人就只提取了第一个内容,即可以播放的 哪吒之魔童降世 的完整视频。

本人选用的是通过 xpath 的形式来抓取,具体 dom 抓取操作可以看本人之前的文章,传送门

https://www.cnblogs.com/weijiutao/p/10879871.html

https://www.cnblogs.com/weijiutao/p/10880805.html

https://www.cnblogs.com/weijiutao/p/10614694.html

通过 aiqiyi.py 我们就爬取到了我们想要的视频内容,然后将获取到的信息返回给前端页面即可,

前端页面 teplate->index.html 代码如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>video</title>
<link rel="stylesheet" href="/static/css/element.css">
<link rel="stylesheet" href="/static/css/style.css">
<script src="/static/js/common/vue.js"></script>
<script src="/static/js/common/axios.js"></script>
<script src="/static/js/common/element.js"></script>
<script src="/static/js/common/qs.js"></script>
<script src="/static/js/common/request.js"></script>
<script src="/static/js/common/jquery.js"></script>
</head>
<body>
<div id="app" v-cloak> <el-container>
<el-header>
<template v-for="item in apiLink">
<el-button type="text" @click="openLinkClick(item.link)">接口[[item.id]]</el-button>
</template>
</el-header>
<el-container class="main_container">
<el-aside width="200px">
<div class="friends_link">
<h3>友情链接</h3>
<template v-for="(item,index) in friendsLink">
<template v-if="index%3 ==0">
<a :href="item.link" target="_blank">
<el-tag type="warning">[[item.name]]</el-tag>
</a>
</template>
<template v-else-if="index%4 ==0">
<a :href="item.link" target="_blank">
<el-tag type="success">[[item.name]]</el-tag>
</a>
</template>
<template v-else-if="index%5 ==0">
<a :href="item.link" target="_blank">
<el-tag type="primary">[[item.name]]</el-tag>
</a>
</template>
<template v-else-if="index%7 ==0">
<a :href="item.link" target="_blank">
<el-tag type="danger">[[item.name]]</el-tag>
</a>
</template>
<template v-else>
<a :href="item.link" target="_blank">
<el-tag type="info">[[item.name]]</el-tag>
</a>
</template>
</template>
</div> </el-aside>
<el-container>
<el-main>
<el-link type="success">将主流网站,如腾讯、爱奇艺、优酷等网站上的播放视频页的 url 链接复制在下方,然后选择接口,点击播放即可</el-link>
<el-form :inline="true" :model="formCopyLink">
<el-form-item>
<el-input v-model="formCopyLink.copyLink" placeholder="请输入内容"></el-input>
</el-form-item>
<el-form-item>
<el-select style="width: 120px;" v-model="formCopyLink.apiLink" placeholder="请选择">
<el-option
v-for="item in apiLink"
:key="item.id"
:label="'接口'+item.id"
:value="item.link"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="openCopyLinkPlayClick">播放</el-button>
</el-form-item>
</el-form>
<el-link type="success">目前只支持爱奇艺,腾讯视频简单搜索,然后选择视频类型,点击搜索即可,后续功能完善中...</el-link>
<el-form :inline="true" :model="formTv">
<el-form-item>
<el-input v-model="formTv.name" placeholder="请输入内容"></el-input>
</el-form-item>
<el-form-item>
<el-select style="width: 120px;" v-model="formTv.type" placeholder="请选择">
<el-option label="电视剧" value="1"></el-option>
<el-option label="电影" value="2"></el-option>
<el-option label="综艺" value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="requestGetTvPlay">搜索</el-button>
</el-form-item>
</el-form> <tv-movie
:tvMovie="aiqiyiData"
@select-link="selectLinkClick"
></tv-movie> <tv-movie
:tvMovie="tencentData"
@select-link="selectLinkClick"
></tv-movie> </el-main>
<el-footer></el-footer>
</el-container>
</el-container>
</el-container> </div>
</body>
<script> Vue.component('tv-movie', {
delimiters: ["[[", "]]"],
props: ['tvmovie'],
data: function () {
return {}
},
methods: {
selectLinkChange(link) {
this.$emit('select-link', link)
}
},
template: `
<div class="tv_movie">
<template v-if="tvmovie">
<h3 class="tv_movie_source">[[tvmovie.source]]</h3>
<div class="tv_movie_content">
<div class="tv_movie_content_left">
<el-image :src="tvmovie.pic"></el-image>
</div>
<div class="tv_movie_content_right">
<div>
<p>[[tvmovie.name]]</p>
</div>
<div>
<p>导演:[[tvmovie.director]]</p>
<p>演员:[[tvmovie.actor]]</p>
</div>
<div>
<p>简介:[[tvmovie.desc]]</p>
</div>
<div>
<template v-for="item in tvmovie.list">
<el-button size="mini" @click="selectLinkChange(item.link)">[[item.title]]
</el-button>
</template>
</div>
</div>
</div>
</template>
</div> `
}) let app = new Vue({
delimiters: ["[[", "]]"],
el: "#app",
data: {
formCopyLink: {
copyLink: "",
apiLink: "",
},
formTv: {
name: "",
type: "1",
},
apiLink: [],
friendsLink: [],
aiqiyiData: null,
tencentData: null,
selectLink: null,
},
mounted() {
this.requestGetMockApiLink();
this.requestGetMockFriendsLink();
},
methods: {
requestGetTvPlay() {
if (!this.formTv.name) return this.$message.warning("请输入要播放的内容");
let data = {...this.formTv};
requestFunc(null, '/api/tvplay', data, (data) => {
if (!data.aiqiyi) this.$message.warning("爱奇艺没搜到数据");
if (!data.tencent) this.$message.warning("腾讯没搜到数据");
this.aiqiyiData = data.aiqiyi;
this.tencentData = data.tencent;
})
},
requestGetMockApiLink() {
requestFunc('get', '/static/mock/apiLink.json', null, (data) => {
this.apiLink = data;
})
},
requestGetMockFriendsLink() {
requestFunc('get', '/static/mock/friendsLink.json', null, (data) => {
this.friendsLink = data;
})
},
selectLinkClick(link) {
this.selectLink = link;
},
openLinkClick(link) {
if (!this.selectLink) return this.$message.warning("请选择要播放的剧集");
window.open(link + this.selectLink, '_blank');
},
openCopyLinkPlayClick() {
if (!this.formCopyLink.copyLink) return this.$message.warning("请输入要播放 url 链接");
if (!this.formCopyLink.apiLink) return this.$message.warning("请选择要播放的接口");
window.open(this.formCopyLink.apiLink + this.selectLink, '_blank');
} },
}); </script>
</html>

在上面的代码中,我们使用了 vue+elementUi 来写前端的代码,并且引入了一些本人所知道的一些五花八门的视频网站的友情链接,其中这些友情链接和 Tampermonkey 中的视频解析链接存在了本地的文件 static->mock 的 json 文件中。

就此,一个简单的破解VIP视频的小工具就完成了。有需要代码可以去码云上查看:https://gitee.com/vijtor/video

声明:上面的代码只是一个简单的实现思路,代码中如有不妥之处请大神批评指正!同时本人严正声明尊重知识产权和版权,对于上面的敏感信息不做任何商业用途,如有侵权问题请及时联系本人,蟹蟹!!!

Python+Tornado+Tampermonkey 获取某讯等主流视频网站的会员视频解析播放的更多相关文章

  1. python + selenium + PhantomJS 获取腾讯应用宝APP评论

    PhantomJS PhantomJS 是一个基于WebKit的服务器端JavaScript API,它无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM 处理.JavaScr ...

  2. 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频

      视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频  2018-07-11 |  标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...

  3. python tornado websocket 多聊天室(返回消息给部分连接者)

    python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...

  4. 获取腾讯soso地图坐标代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. python执行shell获取硬件参数写入mysql

    最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python ...

  6. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  7. 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取

    本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...

  8. Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥。

    Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥. #!/usr/bin/env python # -*- coding: utf- -*- import os im ...

  9. python使用traceback获取详细的异常信息

    原创来自:https://blog.csdn.net/mengtao0609/article/details/55049059 python使用traceback获取详细的异常信息 2017年02月1 ...

随机推荐

  1. 蚂蚁SOFA系列(2) - SOFABoot的Readiness健康检查机制

    作者:404,公众号404P,转载请注明出处. 前言 SOFABoot是蚂蚁金服的开源框架,在原有Spring Boot的基础上增强了不少能力,例如Readiness Check,类隔离,日志空间隔离 ...

  2. IP地址和int互转

    /** * @author: yqq * @date: 2019/5/8 * @description: ip地址与int之间互换 * https://mp.weixin.qq.com/s?__biz ...

  3. F#周报2019年第37期

    新闻 宣告ML.NET 1.4的预览版及更新模型构建器 .NET展示会:一系列的活动! Octopus入门版:对于小团队免费 宣告.NET Core 3.0预览版9 使用IntelliCode更简单地 ...

  4. android 滚动时间选择器

    一.概述 滚动时间选择现在貌似很常用,所以就总结一下,显示效果一般般 , 做个参考吧! 以上就是效果图,可以滚动选择 日期时间, 由于是在 5.0系统运行的,貌似5.0系统做了什么变动,下面的 &qu ...

  5. java读取Excel —— XSSFWorkbook 找不到该类

  6. C#中using的使用-以FileStream写入文件为例

    场景 CS中FileStream的对比以及使用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100396022 关注公众号 ...

  7. 关于W3Cschool定义的设计模式-常用的9种设计模式的介绍

    一.设计模式 tip:每种设计模式,其实都是为了更高效的,更方便的解决在面对对象编程中所遇到的问题. 什么是设计模式:     是一套经过反复使用.多人知晓的.经过分类的.代码设计经验的总结   为什 ...

  8. [LeetCode] 由 “分形" 所想

    分形思想和递归思想有区别么? 一.简单例子 函数调用自己,简化了理解逻辑,但其他到处都是问题. #%% def listsum(numList): if len(numList) == 1: retu ...

  9. JavaScript之深入函数(二)

    上一篇我们主要讲解了函数的执行过程和原理,本篇我们将介绍函数的另外两个特殊表现:闭包和立即执行函数. 一 闭包 1,  闭包的形成 之前我们提到,函数执行完毕,马上就会销毁自己的AO对象.但是如果遇到 ...

  10. 用Python帮你实现IP子网计算

    目录 0. 前言 1. ipaddress模块介绍 1.1 IP主机地址 1.2 定义网络 1.3 主机接口 1.4 检查address/network/interface对象 1.4.1 检查IP版 ...