news 2026/10/15 17:13:44

用Java/JS/Python为PickTV开发Spider爬虫:多语言引擎加载原理与实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Java/JS/Python为PickTV开发Spider爬虫:多语言引擎加载原理与实战教程

【免费下载链接】PickTV

项目地址:https://gitcode.com/gh_mirrors/pi/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();
typeapi格式引擎加载方式
0HTTP URL内建 XML 解析直接 GET 请求
1HTTP URL内建 JSON+Filter直接 GET 请求
3csp_类名Java(DexClassLoader)从jar字段加载 .jar
3xxx.jsJavaScript(QuickJS)加载 .js 脚本
3xxx.pyPython(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:

  1. docs/SPIDER.md — 爬虫 API 完整规格(所有方法参数、JSON 结构、返回示例)
  2. docs/CONFIG.md — 站点配置字段说明
  3. docs/LIVE.md — 直播来源开发
  4. 引擎源码: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

项目地址:https://gitcode.com/gh_mirrors/pi/PickTV
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 17:13:06

Python与MySQL学生管理系统实战:从Tkinter界面到数据库设计

简介&#xff1a;基于Python与MySQL的学生管理系统&#xff0c;提供可视化图形界面&#xff0c;面向学校教务人员或个人开发者&#xff0c;用于学生档案、选课及成绩信息的统一管理&#xff0c;可有效替代手工Excel登记流程。压缩包共2个文件&#xff0c;包含Python主程序与SQL…

作者头像 李华
网站建设 2026/10/15 17:11:50

Struts2实战:登录注册与用户信息管理系统的搭建与避坑

简介&#xff1a;一套基于 Struts2 的登录注册与用户信息管理系统&#xff0c;面向 Java Web 初学者与正在学习 MVC 架构的开发者。项目完整演示了用户注册、登录及信息维护的实现流程&#xff0c;涉及 Action 与 Result 映射、拦截器配置、表单验证、struts.xml 组织方式&…

作者头像 李华
网站建设 2026/10/15 17:10:02

Kumone灰歌解锁完全指南:如何听懂每一首“灰色“歌曲

【免费下载链接】kumone 雲の音 — Native macOS NetEase Cloud Music client built with SwiftUI 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ku/kumone 点击查看 免费下载 如果你在使用网易云音乐客户端时&#xff0c;总是遇到无法播放的灰色歌曲——页面灰掉、点…

作者头像 李华
网站建设 2026/10/15 17:09:08

Basler相机C++ SDK封装实践:构建可复用的CameraWrapper类

简介&#xff1a;针对Basler工业相机二次开发需求&#xff0c;这份C封装类将SDK中分散的初始化、抓图、曝光调节等功能整理成面向对象的接口&#xff0c;让机器视觉或自动化项目中的开发者能快速完成相机调用。类设计同时覆盖了事件回调、错误捕获、线程同步和内存管理&#xf…

作者头像 李华