📖桔纸书屋
https://m.juzhishuwu.net
laizhiyu (6509)4小时前
站点:桔纸书屋(m.juzhishuwu.net;.com 会 301 到 .net)。全站 GBK,jieqiCMS 模板。 【搜索】GET /modules/article/search.php?searchkey=&searchtype=articlename。多结果为 六列表格;单结果站点 302 直跳详情页,靠 bookUrlPattern 走详情兜底。结果链接是 .com 域,用 ##替换 归一成 .net,否则每次详情多等一次 301(实测 +7 秒)。 ★搜索页分页是假的:page=2/3 返回与第 1 页完全相同的内容,故 bookList 对 page>1 直接短路返回空,避免无限翻页。 ★站点限频不稳定:提示「两次搜索的间隔时间不得少于 30 秒」,清 cookie / 换 UA / 伪造时间戳均无效;实测静默 30~45 秒后可恢复,但连续搜索仍会随机报错,属站点侧问题。 【目录】详情页即第 1 页(45 章/页),后续页 /xs/ / /。分页条只显示当前页 ±10 页,故 nextTocUrl 只返回「下一页」1 个 URL(末页 return null)。 ★必须只返回 1 个 URL:源码 BookChapterList 的 when(nextUrlList.size) 中,1→走串行循环(每页再求值一次),其余→走 mapAsync 并发且按「完成顺序」emit(buffer(0)+信号量),章节顺序不可控。只返回 1 个 URL 可强制串行,顺序绝对可控。 ★若一次返回全部页 URL:①并发分支按完成顺序 addAll,长书目录会乱序;②2 页目录的书 page1 只返回 1 个 → 仍走串行 → page2 再求值又返回 page1 → 重复抓取,经 reverse→去重→reverse 后顺序被轮转成「第46章在前、第45章在后」(《我的师父是仙子》实测)。 【正文】#content 内以
分行,章内分页由 a.btn-info 标记(href 形如 xxx_2.html,末页该元素消失)。两个坑:①站点按字数硬截断,跨页会切断句子甚至切断 实体(页尾留 &n、下页开头 bsp;);②部分书(如《完美世界》)站点把正文重复输出 5 份,每份前有「< "https:">提供的《书名》…(第N页)」标记。故正文用 @js 自行按页抓取:以段首 判续行并无缝粘合、遇到第二个分页标记即截断、整页与已收内容重复则跳过、修复断裂实体、剥掉广告尾巴。 【发现】7 个分类 /list/<1-7>_.html、完本 /wanben/1_ 、榜单 /paihangbang.html(8 榜单静态单页,用 ?page= 假参数让第 2 页起返回空以停翻页)。 ★发现页有两种列表结构:分类/完本页用 ul.txt-list-row5(li 含 s1分类/s2书名/s3最新章节/s4作者),榜单页用 ul.txt-list-row3(li 仅含 s1排名/s2书名/s5更新日期,无作者无章节)。bookList 先试 row5、回退 row3,并按 href 去重;榜单页作者与最新章节会留空,进入详情页后由 ruleBookInfo 补齐。 { "bookSourceComment": "站点:桔纸书屋(m.juzhishuwu.net;.com 会 301 到 .net)。全站 GBK,jieqiCMS 模板。\n【搜索】GET \/modules\/article\/search.php?searchkey=<GBK>&searchtype=articlename。多结果为 <tr id=\"nr\"> 六列表格;单结果站点 302 直跳详情页,靠 bookUrlPattern 走详情兜底。结果链接是 .com 域,用 ##替换 归一成 .net,否则每次详情多等一次 301(实测 +7 秒)。\n★搜索页分页是假的:page=2\/3 返回与第 1 页完全相同的内容,故 bookList 对 page>1 直接短路返回空,避免无限翻页。\n★站点限频不稳定:提示「两次搜索的间隔时间不得少于 30 秒」,清 cookie \/ 换 UA \/ 伪造时间戳均无效;实测静默 30~45 秒后可恢复,但连续搜索仍会随机报错,属站点侧问题。\n【目录】详情页即第 1 页(45 章\/页),后续页 \/xs\/<id>\/<page>\/。分页条只显示当前页 ±10 页,故 nextTocUrl 只返回「下一页」1 个 URL(末页 return null)。\n★必须只返回 1 个 URL:源码 BookChapterList 的 when(nextUrlList.size) 中,1→走串行循环(每页再求值一次),其余→走 mapAsync 并发且按「完成顺序」emit(buffer(0)+信号量),章节顺序不可控。只返回 1 个 URL 可强制串行,顺序绝对可控。\n★若一次返回全部页 URL:①并发分支按完成顺序 addAll,长书目录会乱序;②2 页目录的书 page1 只返回 1 个 → 仍走串行 → page2 再求值又返回 page1 → 重复抓取,经 reverse→去重→reverse 后顺序被轮转成「第46章在前、第45章在后」(《我的师父是仙子》实测)。\n【正文】#content 内以 <br> 分行,章内分页由 a.btn-info 标记(href 形如 xxx_2.html,末页该元素消失)。两个坑:①站点按字数硬截断,跨页会切断句子甚至切断 实体(页尾留 &n、下页开头 bsp;);②部分书(如《完美世界》)站点把正文重复输出 5 份,每份前有「< \"https:\">提供的《书名》…(第N页)」标记。故正文用 @js 自行按页抓取:以段首 判续行并无缝粘合、遇到第二个分页标记即截断、整页与已收内容重复则跳过、修复断裂实体、剥掉广告尾巴。\n【发现】7 个分类 \/list\/<1-7>_<page>.html、完本 \/wanben\/1_<page>、榜单 \/paihangbang.html(8 榜单静态单页,用 ?page= 假参数让第 2 页起返回空以停翻页)。\n★发现页有两种列表结构:分类\/完本页用 ul.txt-list-row5(li 含 s1分类\/s2书名\/s3最新章节\/s4作者),榜单页用 ul.txt-list-row3(li 仅含 s1排名\/s2书名\/s5更新日期,无作者无章节)。bookList 先试 row5、回退 row3,并按 href 去重;榜单页作者与最新章节会留空,进入详情页后由 ruleBookInfo 补齐。", "bookSourceGroup": "AI", "bookSourceName": "📖桔纸书屋", "bookSourceType": 0, "bookSourceUrl": "https:\/\/m.juzhishuwu.net", "bookUrlPattern": "https?:\/\/m\\.juzhishuwu\\.(?:com|net)\/xs\/\\d+\\.html", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"玄幻\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/1_{{page}}.html\"},{\"title\":\"修真\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/2_{{page}}.html\"},{\"title\":\"都市\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/3_{{page}}.html\"},{\"title\":\"穿越\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/4_{{page}}.html\"},{\"title\":\"网游\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/5_{{page}}.html\"},{\"title\":\"科幻\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/6_{{page}}.html\"},{\"title\":\"其他\",\"url\":\"https:\/\/m.juzhishuwu.net\/list\/7_{{page}}.html\"},{\"title\":\"完本\",\"url\":\"https:\/\/m.juzhishuwu.net\/wanben\/1_{{page}}\"},{\"title\":\"榜单\",\"url\":\"https:\/\/m.juzhishuwu.net\/paihangbang.html?page={{page}}\"}]", "lastUpdateTime": "1792748877528", "respondTime": 2219, "ruleBookInfo": { "author": "div.info div.fix > p:nth-of-type(1)@text##作\\s*者[::]\\s*", "coverUrl": "div.imgbox img@src", "intro": "div.desc@text||div.m-desc@text##简\\s*介[::]\\s*", "kind": "div.info div.fix > p:nth-of-type(2)@text##类\\s*别[::]\\s*", "lastChapter": "div.info div.fix > p:nth-of-type(5) a@text", "name": "div.info h1@text" }, "ruleContent": { "content": "@js:(function(){var J=Packages.org.jsoup.Jsoup;var MARK=\/提供的《|\\(第\\d+\\\/\\d+页\\)|^<\\\/div>|^<\\s*\"https:\/;function segs(h){var d=J.parse(h);var box=d.select('#content').first();if(box==null)return null;var c=box.clone();c.select('a,script,style').remove();var parts=String(c.html()).split(\/<br\\s*\\\/?>\/i),arr=[];for(var i=0;i<parts.length;i++){var t=parts[i].replace(\/<[^>]+>\/g,'').replace(\/^[ \\t\\r\\n]+\/,'').replace(\/[ \\t\\r\\n]+$\/,'');if(t.replace(\/ |&|\\s\/g,'')==='')continue;if(MARK.test(t)&&arr.length>0)break;arr.push(t);}return {arr:arr,next:(box.select('a.btn-info').size()>0?box.select('a.btn-info').attr('href'):null)};}function isRepeat(page,out){if(out.length<3||page.length<2)return false;var p0=page[0];var lo=Math.max(0,out.length-60);for(var i=lo;i<out.length;i++){if(out[i]!==p0)continue;var ok=0;for(var j=0;j<page.length&&i+j<out.length;j++){if(out[i+j]!==page[j])break;ok++;}if(ok>=Math.min(3,page.length))return true;}return false;}var cur=segs(result),out=[],guard=0;while(cur!=null&&guard<40){guard++;var a=cur.arr;if(a.length>0&&!isRepeat(a,out)){if(out.length>0&&!\/^ \/.test(a[0])){out[out.length-1]=out[out.length-1]+a[0];a=a.slice(1);}for(var i=0;i<a.length;i++)out.push(a[i]);}if(!cur.next)break;cur=segs(java.ajax(cur.next));}var txt=out.join('\\n').replace(\/&(?:amp;)?n\\s*bsp;\/g,' ');txt=txt.replace(\/ \/g,' ').replace(\/<\/g,'<').replace(\/>\/g,'>').replace(\/"\/g,'\"').replace(\/'\/g,\"'\").replace(\/&\/g,'&');var NOISE=\/请牢记|免费最快|无防盗|恋上你看书|bookla|收藏本站|请收藏|请大家收藏|全网最快|更新速度|首发起点|支持正版|看清爽的小说就到|您现在阅读的是|天才一秒|记住本站|无弹窗|笔趣阁|最快更新|本章未完|点击下一页\/;var DOM=\/https?:\\\/\\\/|https?:\\s*\"|www\\.|\\.com|\\.net|\\.org|bookla|提供的《\/;var ls=txt.split('\\n'),res=[];for(var k=0;k<ls.length;k++){var t=ls[k].replace(\/^\\s+|\\s+$\/g,'');if(!t)continue;t=t.replace(\/[,,]\\s*请牢记[::]?.*$\/,'').replace(\/^\\s+|\\s+$\/g,'');if(!t)continue;if(DOM.test(t)&&t.length<90)continue;if(t.length<=60&&NOISE.test(t))continue;res.push(t);}return res.join('\\n');})()" }, "ruleExplore": { "author": "span.s4@text", "bookList": "@js:(function(){var J=Packages.org.jsoup.Jsoup;var m=String(baseUrl).match(\/[?&]page=(\\d+)\/);if(m&&parseInt(m[1])>1)return[];var doc=J.parse(result);var lis=doc.select('ul.txt-list-row5 li');if(lis.size()===0){lis=doc.select('div.row-rank div.tab-bd ul.txt-list-row3:not([style*=none]) li');}var seen={},out=[];for(var i=0;i<lis.size();i++){var li=lis.get(i);var a=li.select('span.s2 a').first();if(a==null)continue;var h=a.attr('href');if(!h||seen[h])continue;seen[h]=1;out.push(li);}return out;})()", "bookUrl": "span.s2 a@href", "kind": "@js:(function(){var a=result.select('span.s1');if(a.size()===0)return '';var t=String(a.first().text()).replace(\/[\\[\\]]\/g,'').replace(\/^\\s+|\\s+$\/g,'');return \/^\\d+$\/.test(t)?'':t;})()", "lastChapter": "span.s3@text", "name": "span.s2 a@text" }, "ruleSearch": { "author": "td:nth-of-type(3)@text", "bookList": "@js:(function(){var m=String(baseUrl).match(\/[?&]page=(\\d+)\/);if(m&&parseInt(m[1])>1)return[];var J=Packages.org.jsoup.Jsoup;var doc=(typeof result==='string')?J.parse(result):result;return doc.select('tr#nr');})()", "bookUrl": "td:nth-of-type(1) a@href##^https?:\/\/m\\.juzhishuwu\\.com##https:\/\/m.juzhishuwu.net", "lastChapter": "td:nth-of-type(2) a@text", "name": "td:nth-of-type(1) a@text", "wordCount": "td:nth-of-type(4)@text" }, "ruleToc": { "chapterList": "#first + div.section-box ul.section-list li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "@js:(function(){var m=String(result).match(\/当前第\\s*(\\d+)\\s*页[,,]\\s*共\\s*(\\d+)\\s*页\/);if(!m)return null;var cur=parseInt(m[1]),total=parseInt(m[2]);if(cur>=total)return null;var bm=String(baseUrl).match(\/^(https?:\\\/\\\/[^\\\/]+)\\\/xs\\\/(\\d+)\/);if(!bm)return null;return [bm[1]+'\/xs\/'+bm[2]+'\/'+(cur+1)+'\/'];})()" }, "searchUrl": "https:\/\/m.juzhishuwu.net\/modules\/article\/search.php?searchkey={{key}}&searchtype=articlename&page={{page}},{\"charset\":\"gbk\"}", "weight": 0 }