webmagic-scripts 使用指南:用 JavaScript/Ruby 脚本零代码编写 WebMagic 爬虫
发布时间:2026/10/14 20:26:41 锦皓数字建站

后端网页爬虫【免费下载链接】webmagicA scalable web crawler framework for Java.项目地址https://gitcode.com/gh_mirrors/we/webmagic点击查看免费下载webmagic-scripts 是 WebMagic 爬虫框架Java中的一个实验性子模块它让你不写 Java 代码只用一段简单的脚本默认 JavaScript也支持 Ruby/JRuby即可完成页面抽取、链接发现与结果输出。本文以 webmagic-scripts/README.md 为主体结合模块源码完整讲解脚本 API、控制台命令行用法、多语言机制与底层执行原理读完你既能直接运行别人写好的脚本也能自己编写并流通一套抓取脚本。一、设计目标让爬虫脚本可编写、可流通模块的目标非常明确用简单脚本的方式编写爬虫为一些常用场景提供可流通的脚本——如果已经有人写好了脚本你直接使用即可无需下载依赖、编写 Java 代码也不需要经历编译打包流程。从仓库结构看该模块位于 webmagic-scripts其 pom.xml 依赖webmagic-core、webmagic-extension并通过maven-jar-plugin将主类配置为us.codecraft.webmagic.scripts.ScriptConsole这正是控制台一键运行能力的来源。它同时引入jruby、jython、commons-cli等依赖对应着多语言引擎支持与命令行参数解析。二、快速上手控制台运行一个抓取脚本原文档提供了一个控制台版本webmagic-console压缩包。解压后使用如下命令执行脚本java -jar -Dfile.encodingutf-8 webmagic-console.jar -f 脚本文件名 [-l 语言默认是javascript] [-t 线程数] [-s 抓取间隔毫秒] url1 url2 …各参数含义如下表参数含义默认值-f脚本文件名必填无-l脚本语言javascript或rubyjavascript-t抓取线程数1-s两次请求之间的抓取间隔毫秒1000位置参数起始 URL可多个url1 url2 …无例如对仓库中自带的 js/github.js 脚本可以这样执行java -jar -Dfile.encodingutf-8 webmagic-console.jar -f github.js -t 2 -s 0 https://github.com/code4craft该命令以 2 个线程、0 毫秒抓取间隔从https://github.com/code4craft开始抓取 GitHub 仓库数据。注意-Dfile.encodingutf-8用于保证脚本文件以 UTF-8 编码读取避免中文或特殊字符乱码。从源码看控制台入口 ScriptConsole.java 会依次完成解析命令行参数 → 用ScriptProcessorBuilder构建ScriptProcessor→ 配置Site设置sleepTime、重试次数 3接受状态码集合200/404/403/500/502→ 创建Spider并添加起始 URL →spider.run()启动抓取。若未提供任何 URL程序会打印用法提示并以-1退出。三、脚本 API三个核心函数与 page 对象脚本之所以简单是因为模块预先注入了少量开箱即用的辅助函数。JavaScript 的辅助函数定义在 js/defines.jsfunction $(str){ return page.getHtml().$(str).toString(); } function xpath(str){ return page.getHtml().xpath(str).toString(); } function urls(str){ links page.getHtml().links().regex(str).all(); page.addTargetRequests(links); }即脚本中可直接使用三个全局函数$(cssSelector)按 CSS 选择器抽取页面元素并转为字符串xpath(xpathExpr)按 XPath 表达式抽取页面元素并转为字符串urls(regex)从当前页面所有链接中匹配正则将命中的 URL 作为后续抓取目标对应 WebMagic 的目标请求机制实现自动翻页/发现新页面。Ruby 的辅助函数定义在 ruby/defines.rb除xpath、urls外还额外提供了css函数Python 的辅助函数定义在 python/defines.py同样提供xpath、css、urls。除了辅助函数脚本运行环境中还注入了两个关键对象见 ScriptProcessor.java 的process方法pageus.codecraft.webmagic.Page实例可直接调用page.getUrl()、page.getHtml()、page.addTargetRequests(...)等 WebMagic 原生方法configSite实例用于在脚本中调整抓取配置。在 JavaScript 中访问这些对象直接用page.xxx在 Ruby 中则通过$page等全局变量defines.rb 中的$page.getHtml()两种语言的约定略有差异使用时需注意。四、实例解析用 JavaScript 抓取 GitHub 仓库数据原文档给出了抓取 GitHub 仓库数据的 JavaScript 脚本即仓库中的 js/github.jsvar namexpath(//h1[classentry-title public]/strong/a/text()) var readmexpath(//div[idreadme]/tidyText()) var starxpath(//ul[classpagehead-actions]/li[1]//a[classsocial-count js-social-count]/text()) var forkxpath(//ul[classpagehead-actions]/li[2]//a[classsocial-count]/text()) var urlpage.getUrl().toString() if (name!null){ println(name) println(readme) println(star) println(url) } urls((https://github\\.com/\\w/\\w)) urls((https://github\\.com/\\w))逐行拆解字段抽取用xpath(...)分别抽取仓库名name、README 正文readme通过 WebMagic 的tidyText()提取干净文本、Star 数与 Fork 数页面 URLpage.getUrl().toString()拿到当前页面地址条件输出只有当name ! null即命中仓库详情页而非个人主页时才输出结果借助 JavaScript 引擎自带的println打印到控制台链接发现urls((https://github\\.com/\\w/\\w))匹配形如用户/仓库的详情页链接urls((https://github\\.com/\\w))匹配个人主页链接两者共同驱动 Spider 自动扩散抓取范围。这段脚本展示了脚本式爬虫的典型抽取-输出-发现三段式写法无需任何 Java 类定义直接交给控制台运行即可。仓库中还提供了另一个 JavaScript 示例 js/oschina.js它用$(div.BlogTitle h1)这种 CSS 写法抽取博客标题并通过urls(http://my\\.oschina\\.net/flashsword/blog/\\d)发现后续博客列表页同时演示了脚本内定义config对象可携带ua、sleepTime等配置项的写法。五、多语言支持Ruby/JRuby 与语言参数原文档说明选用 JavaScript 是因为用户面广选用 Ruby 则是因为Ruby 语法编写 DSL 更简洁。Ruby 版本ruby/github.rbname xpath //h1[classentry-title public]/strong/a/text() readme xpath //div[idreadme]/tidyText() star xpath //ul[classpagehead-actions]/li[1]//a[classsocial-count js-social-count]/text() fork xpath //ul[classpagehead-actions]/li[2]//a[classsocial-count]/text() url$page.getUrl().toString() puts name,readme,star,fork,url unless namenil urls (https://github\\.com/\\w/\\w) urls (https://github\\.com/\\w)Ruby 版本省略了函数调用括号xpath ...、urls ...的写法更接近自然语言 DSL输出使用 Ruby 的puts条件输出使用unless namenil。注意 Ruby 脚本中页面对象通过$page访问。多语言通过-l参数区分。例如执行这个 Ruby 脚本java -jar -Dfile.encodingutf-8 webmagic-console.jar -f github.rb -t2 -s0 -l ruby https://github.com/code4craft从 Params.java 的源码看语言别名映射为-l取值对应引擎js、javascript、JavaScript、JSJavaScriptruby、jruby、Ruby、JRubyJRuby此外虽然原文档只提到 JavaScript 与 Ruby仓库中实际上还内置了JythonPython语言实现Jython.java并有示例脚本 python/oschina.py。同时模块的 [pom.xml](https://link.gitcode.com/i/a1512246080de2e02b654296c0274dc0) 中还引入了 Kotlin 与 Groovy 支持[Github.kt](https://link.gitcode.com/i/6b9a9e42d296e437002be1031fdd38c3) 演示了 Kotlin 编写标准 PageProcessor 的写法[Github.groovy](https://link.gitcode.com/i/d2cd080be00e479623eb64456304ad22) 演示了 Groovy DSL 风格配置Site 与抽取规则的写法可见多语言是其设计主线之一。六、源码级原理ScriptEngine、EnginePool 与执行链路原文档说明这部分使用 Java 的 ScriptEngine 机制完成。深入源码可以看到完整的执行链路1. 处理器ScriptProcessorScriptProcessor.java 实现 WebMagic 的PageProcessor接口。process(Page page)方法从ScriptEnginePool借出一个引擎将page与config即Site注入ScriptContext.ENGINE_SCOPE然后调用language.process(engine, defines, script, page)执行辅助函数定义 用户脚本最后把引擎归还池中。2. 语言抽象LanguageLanguage.java 是抽象基类每个实现类绑定三要素引擎名称engineName、辅助函数定义文件defineFile如js/defines.js、结果收集文件gatherFile。Javascript.java 直接engine.eval(defines \n script)把辅助函数和用户脚本拼接后整体求值而 JRuby.java 会捕获求值返回的RubyHash将其迭代写入page.getResultItems()这就是 Ruby 脚本天然以字典形式返回结果的底层原因。3. 引擎池ScriptEnginePoolScriptEnginePool.java 按线程数预创建 N 个ScriptEngine通过ScriptEngineManager.getEngineByName(language.getEngineName())用LinkedBlockingQueue维护getEngine()出队、release()入队并用AtomicInteger统计可用数量——这保证了多线程抓取时每个线程有独立脚本引擎避免引擎状态互相污染。4. 测试佐证ScriptProcessorTest.java 分别用Javascript、JRuby、Jython三种语言加载 classpath 下的 oschina 脚本配合Spider.create(pageProcessor)实际抓取并校验执行流程该测试类标注Ignore属于需要联网环境的集成性测试。七、以库的形式集成ScriptProcessorBuilder除了控制台脚本能力也能作为 Java 库直接嵌入自己的程序。构建器 ScriptProcessorBuilder.java 提供链式 APIcustom()创建构建器默认语言为 JavaScript默认线程数 1language(Language)指定语言new Javascript()/new JRuby()/new Jython()scriptFromFile(fileName)从文件系统读取脚本scriptFromClassPathFile(fileName)从 classpath 读取脚本如js/oschina.jsscript(String)直接传入脚本源码字符串thread(int)设置引擎池线程数build()构建ScriptProcessor。参考 ScriptProcessorTest.java 的用法ScriptProcessor pageProcessor ScriptProcessorBuilder.custom() .language(new Javascript()) .scriptFromClassPathFile(js/oschina.js) .build(); pageProcessor.getSite().setSleepTime(0); Spider.create(pageProcessor).addUrl(http://my.oschina.net/flashsword/blog).setSpawnUrl(false).run();build()后得到的是标准PageProcessor可直接交给Spider.create(...)使用与 WebMagic 原有 API 无缝衔接。八、进阶命令行参数解析与日志级别控制台的参数解析由 CommandLineOption.java 实现基于 commons-cli实际支持 5 个选项选项作用-l语言交给Params.setLanguagefromArg做别名匹配-f脚本文件路径-s抓取间隔毫秒Integer.parseInt解析-t线程数Integer.parseInt解析-g日志级别交给 ConfigLogger.java 处理-g可取值包括debug、info、warn、trace、off、error大小写不敏感通过设置 SLF4J root logger 的日志级别来控制控制台输出详略便于排查脚本问题。从 Params.java 还可确认各参数默认值语言默认Javascript、线程数默认 1、抓取间隔默认 1000 毫秒与 README 描述一致。九、注意事项与实验状态原文档明确指出这个功能目前仍在实验阶段。因此在实际使用中需要了解以下前提与限制依赖运行时环境JavaScript 依赖 JDK 自带的 Nashorn 等 ScriptEngine 实现Ruby、Python 支持依赖jruby、jython依赖包见 pom.xml引擎是否可用取决于你的 Java 版本与 classpath脚本运行于沙箱之外脚本本质是在 JVM 内直接求值可访问注入的page、config对象请勿运行来源不可信的脚本实验性 API辅助函数集合、结果收集方式Ruby 的 Hash 返回、Python 的result字典在不同语言间并不完全统一升级 WebMagic 版本时脚本可能需要相应调整控制台方式仓库以webmagic-scriptsMaven 模块形式提供源码与构建配置主类为ScriptConsole如需控制台版 jar 包可自行构建该模块获取。总体而言webmagic-scripts 以脚本即爬虫的思路大幅降低了 WebMagic 的使用门槛让常用抓取场景沉淀为一行命令即可运行的脚本资产。无论是快速验证抽取规则、临时抓取数据还是向团队流通标准化的抓取脚本它都是一条值得尝试的轻量路径。赞分享后端网页爬虫【免费下载链接】webmagicA scalable web crawler framework for Java.项目地址https://gitcode.com/gh_mirrors/we/webmagic点击查看免费下载相关推荐WebMagic 爬虫框架使用教程WebMagic 爬虫框架使用教程 项目介绍 WebMagic 是一个简单灵活的 Java 爬虫框架它基于模块化设计易于扩展和维护。WebMagic 提供了后端网页爬虫终极指南用eSearch免费离线OCR轻松识别古籍竖排文字终极指南用eSearch免费离线OCR轻松识别古籍竖排文字 还在为古籍文献、书法作品的文字识别而烦恼吗传统OCR工具面对竖排文字时常常束手无策识别结果混乱桌面应用OCR屏幕录制视频处理图像处理从封禁到稳定WebMagic爬虫速率控制完全指南从封禁到稳定WebMagic爬虫速率控制完全指南 你是否曾因爬虫请求过于频繁导致IP被封禁是否遇到过目标网站反爬机制导致数据抓取不稳定本文将通过WebMa后端网页爬虫上一篇为什么你的六足机器人走不稳Hexapod5 的 5 个关键设计决策下一篇Altair桑基图终极指南Python流量数据可视化与路径分析指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。