资源猎手是一款支持多种解析规则(jsoup、XPath、jsonPath、正则表达式)的网络资源抓取工具。本文档详细说明了如何配置和使用这些规则来高效提取网页数据。
在开始前,建议先学习以下基础知识:
软件支持四种规则类型:
- jsoup - HTML解析
- XPath - XML/HTML路径查询
- jsonPath - JSON数据提取
- 正则表达式(Regex) - 文本模式匹配(建议作为补充使用)
用于匹配包含多个结果的容器元素。
从每个列表项中提取所需属性或内容。
<div class="tbox">
<div class="ssbox">...</div>
<div class="ssbox">...</div>
<div class="ssbox">...</div>
</div>- jsoup:
div.ssbox - XPath:
//div[@class="ssbox"] - 正则:
@Regex:<div class="ssbox">[\s\S]*?<div class="sbar">[\s\S]*?/div>
使用@range限定结果范围:
div.ssbox > @range(0..2) // 获取第1-3项
//div[@class="ssbox"] > @range(1..4) // 获取第2-5项
@Regex:...##@range(0..2) // 正则需用##分隔
路径规则 > @id获取此节点元素的id属性。路径规则 > @text获取此节点元素及其所有子元素的规范化组合文本。路径规则 > @html- 检索此节点元素的内部HTML。节点为<div>,内部为一个空<p>,将返回<p>。路径规则 > @outerhtml- 获取此节点元素的外部HTML。假如节点为<p>,可能返回Para
。
路径规则 > @attr(特定属性名称)获取此节点元素的属性值,例如:@attr(src),@attr(href),@attr(abs:src),@attr(abs:href)此处abs指获得绝对URL,即完整的网址。- 其他属性:[
@className,@tagName,@data,@wholeText,@ownText,@normalName....]
在XPath中,获取节点的属性通常使用
@符号。当你想要获取某个元素的属性值时,可以使用@属性名
路径规则/text()- 获取此节点元素及其所有子元素的规范化组合文本。路径规则/@id- 获取此节点元素的id属性。路径规则/@src- 获取此节点元素的src属性。路径规则/@href- 获取此节点元素的href属性。- ....依此类推...
@Regex:pattern##1- 提取第一个捕获组@Regex:<a href=\"(.*?)\"##1此处##1表示获取第一个子匹配文本,即(.*?)中的内容,如果为0则是整个匹配结果。
仅适用于属性规则,对列表规则无效。
原规则 + 扩展规则原规则 > @trim去除属性结果的前后空白,正则表达式使用原规则##trim()。原规则 > @uppercase将属性结果转换为大写,正则表达式使用原规则##uppercase()。原规则 > @lowercase将属性结果转换为小写,正则表达式使用原规则##lowercase()。原规则 > @clearText(文本|文本|文本)从属性结果中清除文本内容,多个文本使用|分隔。原规则 > @replaceText(Windows,Macos|Android,iphone)从属性结果中替换文本内容,多个替换规则使用|分隔,互相替换的文本之间使用小写,分隔,正则表达式使用原规则##replaceText(Windows>>Macos|Android>>iphone)。- 属性规则可叠加使用,如:
原规则 > @trim > @clearText(...)。
** 仅适用于正则
**
原规则 > @htmlToString()将正则匹配的结果从Html转换为规范的文本内。** 正则规则规范
规则##索引##属性##属性···属性可叠加使用** 示例:
正则表达式##1##@htmlToString()##@clearText(...)** 解释:从正则表达式结果中提取第一个子匹配内容,并将内容从Html转换为文本,然后从文本中清除指定文本。
id通常使用host地址生成MD5,每个搜索源的Id必须是唯一的。method请求方式,0为GET,1为Postcharset网站编码,也用于搜索关键词编码{keywords}搜索关键词,软件会自动将其替换为URL编码后的关键词。{keywords-base64}搜索关键词,软件会自动将其替换为Base64编码后的关键词。{keywords-un-encoded}搜索关键词,软件会自动将其替换为不使用URL编码后的原始关键词。allowProxy是否允许搜索源通过设备代理进行网络请求。creationDate搜索源创建日期【13位时间戳,毫秒】,当前时间戳 。itemHrefPrefix软件内会自动将@MagnetV1替换为magnet:?xt=urn:btih:@MagnetV2替换为magnet:?xt=urn:btmh:1220,当然,你也可以使用普通的字符串代替。pageOffset大部分网站的页标通常从1开始,但极少部分网站可能是从0开始,那么程序内部默认页标1则无法满足需求,那么只需要修改pageOffset即可,软件内将使用默认页标(1|当前页索引)+pageOffset,我们只需要将pageOffset修改为-1即可。具体根据网站页标需求决定。
BT磁力天堂
{
"id": "b09b75f63ac19985e4a35be9a20c0398",
"name": "BT磁力天堂",
"host": "https://www.691061.xyz/",
"method": 0,
"charset": "UTF-8",
"favicon": "/static/favicon.ico",
"searchApi": "/main-search-kw-{keywords}-{page}.html",
"pageOffset": 0,
"allowProxy": true,
"creationDate": 1751567801463,
"description": "",
"itemListRule": "div.search-item.detail-width",
"itemNameRule": "div.item-title > h3 > a > @text",
"itemSizeRule": "div.item-bar > span:nth-child(3) > b > @text",
"itemDateRule": "div.item-bar > span:nth-child(2) > b > @text",
"itemHrefRule": "div.item-title > h3 > a > @attr(href) > @clearText(/hash/|.html)",
"itemHrefPrefix": "@MagnetV1",
"itemHrefSuffix": "",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
}
}种子搜
{
"id": "edca11e3ddab12942dd3d10dc64c0415",
"name": "种子搜",
"host": "https://m.zhongziso.com/",
"method": 0,
"charset": "UTF-8",
"favicon": "",
"searchApi": "/list/{keywords}/{page}",
"pageOffset": 0,
"allowProxy": true,
"creationDate": 1750323550240,
"description": "",
"itemListRule": "ul.list-group",
"itemNameRule": "li:nth-child(1) > a > @text",
"itemSizeRule": "dd.text-size > @text",
"itemDateRule": "dd.text-time > @text",
"itemHrefRule": "@Regex:href=\"(magnet:\\?xt=urn:btih:[A-Za-z0-9]{32,40}+)\"##1",
"itemHrefPrefix": "",
"itemHrefSuffix": "",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
}
}磁力先锋
{
"id": "26fb95f2296f3528419b790045c58774",
"name": "磁力先锋",
"host": "https://clxf.best/",
"method": 0,
"charset": "UTF-8",
"favicon": "https://ciliku.net/favicon.ico",
"searchApi": "/search.php?name={keywords}&page={page}",
"pageOffset": 0,
"allowProxy": true,
"creationDate": 1750683900224,
"description": "",
"itemListRule": "div.card.border-dashed.border-2.mb-2",
"itemNameRule": "h5 > @clearText(🧲)",
"itemSizeRule": "p.card-text.mb-1 > span:nth-child(1) > @text",
"itemDateRule": "@Regex:更新时间:(\\d{4}-\\d{2}-\\d{2})##1",
"itemHrefRule": "@Regex:xiangqing(\\('\\d','.*?'\\))##1##replaceText(('>>https://clxf.best/detail.php?sjk=|','>>&md5hash=)##clearText('))",
"itemHrefPrefix": "",
"itemHrefSuffix": "",
"requireDetailPage": true,
"detailNameRule": "",
"detailSizeRule": "",
"detailDateRule": "",
"detailHrefRule": "@Regex:资源哈希:([a-zA-Z0-9]{32,40})##1",
"detailHrefPrefix": "@MagnetV1",
"detailHrefSuffix": "",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
}
}磁力天堂
{
"id": "1d2c8892ab3ee7a0152a151ec3d2414a",
"name": "磁力天堂",
"host": "https://janrzbvl.770670.xyz",
"method": 0,
"charset": "UTF-8",
"favicon": "",
"searchApi": "/search-{keywords}-0-0-{page}.html",
"pageOffset": 0,
"allowProxy": true,
"creationDate": 1750323472465,
"description": "",
"itemListRule": "//div[@class='search_result']/dl",
"itemNameRule": "dt > a > @text",
"itemSizeRule": "@Regex:<span>文档大小:(.*?)</span>##1",
"itemDateRule": "@Regex:收录时间:<b>(.*?)</b>##1",
"itemHrefRule": "@Regex:<span><a href=\"(.*?)\"##1",
"itemHrefPrefix": "",
"itemHrefSuffix": "",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
}
}订阅源可包含多个搜索源。
订阅源ID必须是唯一不重复的。
{
"id": "A0000001",
"name": "综合搜索",
"searchers": [
{搜索源1},
{搜索源2},
...
]
}- 优先使用jsoup/XPath规则
- 正则表达式作为最后手段
- 测试规则时从简单开始逐步完善
- 注意编码设置与网站一致
- 合理使用属性处理链简化后续处理
Q: 如何提取磁力链接?
A: 使用 itemHrefPrefix 拼接匹配结果或直接匹配完整磁力链接
Q: 页码不从1开始怎么办?
A: 调整 pageOffset(如从0开始设为-1)
Q: 如何获取绝对URL?
A: 使用 @attr(abs:href)