【免费下载链接】PickTV
PickTV 是一款面向电视与手机的影视聚合播放应用,其核心能力之一就是Spider 爬虫引擎:它允许开发者用Java、JavaScript(QuickJS)或 Python(Chaquopy)三种语言编写数据源插件,通过统一的 Spider 抽象接口加载进应用,即可为 PickTV 增加影视、直播、搜索等数据源。本文带你从零理解 PickTV Spider 爬虫的多语言引擎加载原理,并给出三语言的实战开发教程。
一、Spider 是什么?一个接口,三种语言
在 PickTV 中,每个影视来源(Site)都对应一个 Spider 实例。所有 Spider 都继承同一个抽象基类 Spider.java,它定义了完整的"爬取生命周期":
| 方法 | 作用 |
|---|---|
init(context, extend) | 初始化,接收配置中的ext扩展字段 |
homeContent(filter) | 获取首页分类 |
homeVideoContent() | 获取首页推荐影片 |
categoryContent(tid, pg, ...) | 分类列表(支持分页与筛选) |
detailContent(ids) | 影片详情与播放集数 |
searchContent(key, quick) | 关键词搜索 |
playerContent(flag, id, vipFlags) | 播放地址解析 |
liveContent(url) | 直播频道列表 |
proxy(params) | 本地代理,居中转发媒体数据 |
destroy() | 释放资源 |
所有方法默认返回空值,你只需要覆写用到的部分。完整的参数与 JSON 返回结构规范见官方文档 docs/SPIDER.md。
二、多语言引擎的加载原理
应用启动时,配置中的type与api字段决定了使用哪个引擎。核心分发逻辑位于 BaseLoader.java:
if (isPy(api)) return pyLoader.getSpider(key, api, ext); // .py else if (isJs(api)) return jsLoader.getSpider(key, api, ext, jar); // .js else if (isCsp(api)) return jarLoader.getSpider(key, api, ext, jar); // csp_ else return new SpiderNull();type | api格式 | 引擎 | 加载方式 |
|---|---|---|---|
0 | HTTP URL | 内建 XML 解析 | 直接 GET 请求 |
1 | HTTP URL | 内建 JSON+Filter | 直接 GET 请求 |
3 | csp_类名 | Java(DexClassLoader) | 从jar字段加载 .jar |
3 | xxx.js | JavaScript(QuickJS) | 加载 .js 脚本 |
3 | xxx.py | Python(Chaquopy) | 加载 .py 脚本 |
三种引擎的加载器实现分别位于 app/src/main/java/com/fongmi/android/tv/api/loader/ 目录:
- Java 引擎:JarLoader.java 通过
DexClassLoader动态加载 .jar 文件,反射实例化com.github.catvod.spider.类名,实现真正的热插拔; - JS 引擎:JsLoader.java 调用 QuickJS 模块(quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java),在独立的 JS 上下文中执行脚本,脚本通过
module.exports.default导出爬虫对象,并可使用内置的http请求库与local本地模块; - Python 引擎:PyLoader.java 基于 Chaquopy 启动 Python 运行时(chaquo/src/main/java/com/fongmi/chaquo/Spider.java),把 Java 调用逐层桥接到 Python 对象的同名方法,可直接使用
requests、lxml等生态库。
三种引擎加载的 Spider 实例会被缓存在ConcurrentHashMap中,同一来源不会重复初始化;配置重载时统一调用destroy()清理。
三、站点配置怎么写?
在 PickTV 的站点配置(JSON)中,每个来源的关键字段如下,完整字段说明见 docs/CONFIG.md:
{ "key": "mySite", "name": "我的数据源", "type": 3, "api": "my_spider.js", "jar": "http://example.com/my-spider.jar", "ext": "https://example.com" }api以.js结尾 → JS 引擎;以.py结尾 → Python 引擎;以csp_开头 → Java 引擎(此时jar指定 .jar 地址);ext会原样传入init(),你可以放首页 URL、Token、JSON 配置等;api既可以是远程 URL(启动时自动下载到本地缓存),也可以直接内嵌脚本内容。
四、实战:三种语言各写一个爬虫
1. JavaScript(QuickJS)——最轻量
JS 爬虫只需一个 .js 文件,通过module.exports.default导出对象即可。可用全局http对象发起请求,内置 cheerio 解析 HTML:
module.exports.default = { init: function (extend) {}, home: function (filter) { return { class: [{ type_id: "1", type_name: "电影" }] }; }, detail: function (id) { return { list: [{ vod_id: id, vod_name: "示例电影", vod_play_from: "m3u8", vod_play_url: "正片$https://cdn.example.com/a.m3u8" }] }; } };JS 引擎运行细节(模块加载、异步执行、代理转发)见 quickjs/src/main/assets/js/lib/spider.js 与 quickjs/src/main/assets/js/lib/ 下的内置库。
2. Python(Chaquopy)——生态最丰富
Python 爬虫继承基类 spider.py,它已经内置了fetch/post(requests)、html(lxml)、log、getCache/setCache(应用内置缓存服务)、getProxyUrl等工具方法,单例模式保证全局唯一实例:
from base.spider import Spider class Spider(Spider): def init(self, extend=""): self.extend = extend def detailContent(self, ids): return {"list": [{"vod_id": "1", "vod_name": "示例电影", "vod_play_from": "m3u8", "vod_play_url": "正片$https://cdn.example.com/a.m3u8"}]}Python 运行时入口在 chaquo/src/main/python/app.py,它会先把远程 .py 脚本下载到应用缓存目录,再用SourceFileLoader动态加载。
3. Java(JAR)——性能最强
Java 爬虫继承 Spider.java 抽象类,编译成 .jar 后通过配置中的jar字段加载:
public class MySpider extends com.github.catvod.crawler.Spider { @Override public String detailContent(List<String> ids) { return "{\"list\":[{\"vod_id\":\"1\",\"vod_name\":\"示例电影\"," + "\"vod_play_from\":\"m3u8\",\"vod_play_url\":\"正片$https://cdn.example.com/a.m3u8\"}]}"; } }Java 版可直接复用应用内的 OkHttp(Spider.client())与 catvod/src/main/java/com/github/catvod/net/ 下的网络栈,还能通过Proxy.getUrl()获取本地代理地址,适合需要高性能并发或复杂加解密场景。
五、本地代理 proxy:// ——播放器取不到地址时的救星
当媒体地址带 Referer 限制或需要鉴权时,可以返回proxy://开头的地址,让请求由本应用内的本地代理服务器转发,再由对应语言的proxy()方法处理。各语言获取代理地址的方式见 docs/SPIDER.md 中的「爬蟲本地代理 URL」一节,HTTP 接口细节见 docs/LOCAL.md。
六、学习路径与参考资料
📌 建议按以下顺序上手:先读规范 → 选一种语言 → 用内置引擎(type 0/1)跑通最简单来源 → 再升级到type: 3自定义 Spider:
- docs/SPIDER.md — 爬虫 API 完整规格(所有方法参数、JSON 结构、返回示例)
- docs/CONFIG.md — 站点配置字段说明
- docs/LIVE.md — 直播来源开发
- 引擎源码:catvod/src/main/java/com/github/catvod/(公共层)、quickjs/src/main/java/com/fongmi/quickjs/(JS 引擎)、chaquo/src/main/java/com/fongmi/chaquo/(Python 引擎)
掌握 PickTV Spider 爬虫后,你就可以用任意熟悉的语言为自己的影视数据源"插上翅膀",让 PickTV 的内容世界无限扩展。🚀
【免费下载链接】PickTV
相关推荐
PickTV点播源接入实战:4种type类型对比与JSON API/Spider爬虫配置教程
PickTV点播源接入实战:4种type类型对比与JSON API/Spider爬虫配置教程 给智能电视装一个好用的影音应用不难,难的是"有片源"。本文以开源项
终极Python指南实战:Web爬虫开发与反爬虫策略全解析
终极Python指南实战:Web爬虫开发与反爬虫策略全解析 GitHub 加速计划 / py / python guide 是一份为人类编写的 Python 最
文档教程Amlogic电视盒子Armbian系统实战指南:从Android到Linux服务器的完美转型
Amlogic电视盒子Armbian系统实战指南:从Android到Linux服务器的完美转型 amlogic s9xxx armbian项目为Amlogic、
嵌入式开发工具构建工具操作系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考