終極自動翻頁 - 加載並拼接下一分頁內容至當前頁尾,智能適配任意網頁
这个需要自己编辑规则,需要懂一点css或者xpath知识。 如果不想要写规则的话,你也可以直接选择命令里面的强制拼接-拼接整页。
规则其实写起来很简单,例如具体到这个网站就是
{ "name":"17K小说网", "url":"^https://www\\.17k\\.com", "pageElement":".area>.read,.area>.comment" }
其他网站也是一样的,打开控制台查看元素的class和id自己改改就行了
有个小问题,class 里面的空格该怎么处理?有个叫"readAreaBox content"的 class,直接填进去出错了。
{
"name":"17K小说网",
"url":"^https://www\\.17k\\.com",
"pageElement":".area>.read>.readArea>.readAreaBox content, .area>.read>.NextPrevBtn, .area>.comment"
}
.readAreaBox.content
不过你这样改的话会把原先的页面结构破坏掉,还是在我上面的基础上加上css来隐藏不需要的内容吧 例如
{ "name":"17K小说网", "url":"^https://www\\.17k\\.com", "pageElement":".area>.read,.area>.comment", "css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}" }
当然,如果想要加上标题的话也可以这样写规则
{ "name":"17K小说网", "url":"^https://www\\.17k\\.com", "pageElement":".area>.read,.area>.comment", "css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}", "pageBarText":1 }
大佬就是大佬!调整以后页面漂亮多了,简直比广告过滤还强。油猴脚本用的是 css 语言?
还请问下 github 里范例
{
"name":"xxgame",
"action":0,
"url":"^http://www\\.xxgame\\.net/chinese",
"pageElement":"div.layui-row>div.layui-col-md4:not(div:nth-child(5),div:nth-child(6),div:nth-child(7))",
"nextLinkByUrl":["(http://www\\.xxgame\\.net/chinese/?)(?:\\?page=|$)(\\d*)","$1?page={($2.0||1)+1}"]
}
"action":0 和 "nextLinkByUrl" 是什么意思?我看脚本有点儿复杂,不太明白。
还发现一个 bug,老版本中我记得双击 spacer 会隐藏太极的,好像现在失效了。无论设置 pause 还是 hide,都是暂停翻页效果,不知怎么回事?
action:0代表直接用gm函数获取页面内容,适合大多数静态网页。nextLinkByUrl表示通过页面url而非分析页面来获取下一页,这里后面的参数是正则的匹配项与替换项。
这些我在Github上都有写。
双击隐藏属于可配置项,配置页面第一个多选框就是,勾上就行啦
额,我这边的电脑勾上第一个选项后,双击隐藏依旧没有生效。请再测试下?
此外,实践的时候碰到个技术问题,17K的网页有时用静态网页获取的方式翻页不了。比如:https://www.17k.com/chapter/3381946/45364882.html
从35章往下翻,在第36章会卡住,原因是36章的“下一章”链接指向:javascript:Book.nextChapter(),好像不是静态链接。大佬,这种情况想要翻页怎么办?
使用的规则:
{
"name":"17K小说网",
"url":"^https://www\\.17k\\.com",
"pageElement":".area>.read,.area>.comment",
"css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}",
"pageBarText":1
}
也是一样的,只不过你需要强行指定下一页,否则这个非静态链接优先级是比评论处的最新评论的优先级低,抓取就会出错。 例如这样
{ "name":"17K小说网", "url":"^https://www\\.17k\\.com", "pageElement":".area>.read,.area>.comment", "css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}", "pageBarText":1, "nextLink":".nextChapter" }
大佬,复制使用上面的新规则以后,出现了新的问题,有3种情况:
1、假如我从第35章(静态链接)开始往下翻,结果出来是35章、36章、36章、卡住;
(第35章的链接:)https://www.17k.com/chapter/3381946/45364882.html
2、假如我从第36章(非静态链接)开始往下翻,结果出来是36章、37章、38章、39章、40章、卡住,其中,40章又是一个非静态链接,它的“下一章”链接同样是 javascript:Book.nextChapter() 这种情式;
(第36章的链接:)https://www.17k.com/chapter/3381946/45364887.html
3、切换成强制拼接模式,从第35章开始往下翻,结果出来是35章、36章、36章、37章、38章、39章、40章、38章、39章、40章、39章、卡住。
如上所述,因为17k是交替使用静态和动态链接,这时候想要一口气翻到底的话,还能解决吗?
更新下脚本就行了,最新版已经兼容这种情况了。
更高级的用法是使用nextLinkByJs,使用js代码拼接下一页的链接。这个规则我就不写啦。主要思路就是根据它url的规则,https://www.17k.com/chapter/小说ID/章节ID.html,正则提取动态按钮里面的数字拼接到最后,然后返回
很强。这个规则是只针对17k生效吗?还是对类似的网站都会起作用?
更新脚本后重新跑了下,确实可以翻页了,美中不足的是,有些 spacer 的章节标题跟真正的标题差了一章,大佬可以检查一下么?
仍旧从第35章开始:https://www.17k.com/chapter/3381946/45364882.html
大概是37章的标题有问题。
感谢!抓到一只bug,已经修复啦
有关 vip 章节的问题,该问题比较复杂,可能描述得不清楚。请跟随下列动作以重现:
1、点击下面链接打开并解锁17k的 vip 章节,关闭:
https://h5.17k.com/chapter/3381946/45475842.html?hmsr=smss
2、打开电脑网页端的第98章:
https://www.17k.com/chapter/3381946/45475842.html
3、使用滚轮从网页顶部滑动到底部,等待永页机脚本加载,完成后继续滑动至底部,依次进行,大概在104章的时候,加载的页面只有一小段儿(非 vip 内容),并显示“17K小说网 VIP章节, 余下还有xx个段落 ...”
大佬,我想要完整地加载完所有小说内容,这个能解决吗?
我的规则:
{
"name":"17K小说网",
"url":"^https://www\\.17k\\.com",
"pageElement":".Context>.Article",
"css":".infoPath{display:none}",
"pageBarText":1
}
添加“wait”属性就行,规则如下
{ "name":"17K小说网2", "url":"^https://www\\.17k\\.com", "pageElement":"div.content", "pageBarText":1, "action":1, "nextLink":".nextChapter", "wait":"return doc.querySelector('.copy')==null" }
你看我帮你这么多,帮我扩散一下光辉物语的汉化项目呗,朋友
https://greasyfork.org/scripts/442610
ok,以后看到身边有会日语的或是玩这个游戏的人,我会帮忙推广的。
再请教下,两个17k规则能同时运用吗?同时填上两个规则后,之前的免费章节永页机脚本好像失效了。如:第三十五章 初初见你
[
{
"name":"17K小说网_免费章节",
"url":"^https://www\\.17k\\.com",
"pageElement":".area>.read,.area>.comment",
"css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}",
"pageBarText":1,
"nextLink":".nextChapter"
},
{
"name":"17K小说网_付费章节",
"url":"^https://www\\.17k\\.com",
"pageElement":".Context>.Article",
"pageBarText":1,
"action":1,
"nextLink":".nextChapter",
"wait":"return doc.querySelector('.copy')==null"
}
]
加了个项include,用来匹配规则。需要先更新下脚本再用
[ { "name":"17K小说网_免费章节", "url":"^https://www\\.17k\\.com", "pageElement":".area>.read,.area>.comment", "css":".read_tit,.rightSide{display:none}.readAreaBox{width:auto}", "pageBarText":1, "nextLink":".nextChapter" }, { "name":"17K小说网_付费章节", "url":"^https://www\\.17k\\.com", "pageElement":"div.content", "pageBarText":1, "action":1, "nextLink":".nextChapter", "wait":"return doc.querySelector('.copy')==null", "include":"div.content" } ]
wow,你这几千行的代码,又没有注释,说改就改,一下子就定位到了目标,难以想象。
再问一下大佬,github 里自定义规则的那个框叫什么?xpath 还是 selector?若想要在里面添加多行注释该怎么办?
框里那个就是个JSON而已哈,没有注释功能的,你可以在下面添加属性来做笔记,比如"info1":"这是一个css选择器,其中x代表类名。。。"
这样子。
期待你来为永页机添砖加瓦,可以加上"author":"达圣"属性来提交到github库,这样别人就能用上你贡献的规则啦。
嗯,永页机现行脚本很全面了,平时用的站点差不多都已覆盖,以后有用得着的地方我会报告或者提交个人规则吧。(Google 好像有点儿问题)
经测试,spacer 的章节标题不匹配的现象仍然存在,这次是在 vip 章:风起龙城 第九十八章,注意第一百章的标题。
我的规则:
[
{
"name":"17K小说网_免费章节",
"url":"^https://www\\.17k\\.com",
"pageElement":".area>.read,.area>.comment",
"css":".infoPath,.read_tit,.rightSide,.tuijian{display:none}.readAreaBox{width:auto}",
"pageBarText":1,
"nextLink":".nextChapter",
"annotation":" nextLink 针对17k小说网的非静态目标链接 javascript:Book.nextChapter() "
},
{
"name":"17K小说网_付费章节",
"url":"^https://www\\.17k\\.com",
"pageElement":".Context>.Article",
"pageBarText":1,
"action":1,
"nextLink":".nextChapter",
"wait":"return doc.querySelector('.copy')==null",
"annotation":" wait 属性可以解决付费章节缓冲问题,保证章节全文内容被输出"
}
]
修复啦,又掐死一只bug
感谢大佬,永页机针对17k网站的效果应该挺好了。
再帮忙看看这个:校园花心高手 第294章,有些章节比如295章不能翻页,不知道什么原因?
我的规则:
[
{
"name":"厚海网",
"url":"^http://www\\.houhaiwang\\.com",
"pageElement":".col-a1 > .row-b7"
}
]
需要手动指定下一页
{ "name":"厚海网", "url":"^http://www\\.houhaiwang\\.com", "pageElement":".col-a1 > .row-b7", "nextLink":".col-d3>span>a" }
大佬,请问下,如果没有手动指定 "nextLink",脚本自动找到的元素是什么?为什么有些章节可以?有些就不行呢?
"nextLink":".col-d3>span>a"
因为智能规则基于性能考虑,判断时限制字数长度了,目前是15字符为限,上面那个295章字数正好是16,超出了,所以需要手动指定。
发现 晋江文学城 还没有适配规则,给它补了一个。
{
"name":"晋江文学城",
"url":"^http://www\\.jjwxc\\.net",
"pageElement":"table#oneboolt>tbody>tr>td>.noveltext",
"pageBarText":1,
"commnet_nextLink":"table#oneboolt>tbody>tr>td.noveltitle>span>a | 同时有两个a?怎么写?"
}
如果智能引擎能找到的话,nextLink 省略就行了
由于第14页内容章节被锁,脚本翻页到这里的时候,自动规则没法抓取到第15页的链接,后面内容就不能翻页了。大佬有没有什么好法子跳过去?
康乐天下 第13页(正常章节)
康乐天下 第14页(屏蔽章节)
好办,直接添加 ",#lockpage" 把被锁章节的css选择器也包括进来就行啦
{ "name":"晋江文学城", "url":"^http://www\\.jjwxc\\.net", "pageElement":"table#oneboolt>tbody>tr>td>.noveltext,#lockpage", "pageBarText":1 }
方法大好。但是,测试发现被锁章节是个非静态网页,它会在 10 秒后自动跳转至目录页,导致翻页脚本额外多出一页,并且在 10 秒后无法翻页。
从下面链接开始翻页,只翻一页,并耐心等 10 秒左右,观察后续变化。这种怎办?
康乐天下 第13页
另外,第一个太极图标在这里无法显示,大佬后面修改下。
早上好啊,太极图标在设置里把输入框里的内容清空就可以还原啦。至于你图上的情况,看起来应该是开启了强制拼接导致的,取消强制拼接就行啦。
大佬早,真心给你赞个,果然是开了强制拼接模式,可能是之前调试的时候打开忘关了。所以两个模式的机制是不一样的?我奇怪的是,脚本的大多数规则好像对两者都有效,且效果几乎一样,以致于我都没意识到我还开着强制模式。
再一个问题,由于我习惯看小说看评论,所以我个人的 晋江文学城 规则是这样的:
{
"name":"晋江文学城",
"url":"^http://www\\.jjwxc\\.net",
"pageElement":"table#oneboolt, div.tc, table>tbody>tr>td#comment_list, #lockpage",
"pageBarText":1,
"wait":"return doc.querySelector('.copy')==null"
}
实际呈现的效果是,翻页后的评论框一直是转圈圈状态,但在强制拼接模式下,评论是可见的。不知道为什么?
这样就行啦,其中wait意思是,一直等待直到检测到评论框中的img变成div,或者是章节被锁,才进行提取
{ "name":"晋江文学城", "url":"^http://www\\.jjwxc\\.net", "pageElement":"body>table,div.tc,#lockpage", "pageBarText":1, "action":1, "wait":"return doc.querySelector('#comment_list>div,#lockpage')" }
当然多数情况下,你可以直接添加"wait":"1000" 。代表等待加载,延时1000毫秒再提取
简单,直接改成wait:1000就行啦
{ "name":"晋江文学城", "url":"^http://www\\.jjwxc\\.net", "pageElement":"body>table,div.tc,#lockpage", "pageBarText":1, "action":1, "wait":"1000" }
啊,抱歉抱歉,之前只看到前面那条评论了,wait 的第二种用法被我忽视了,我再试试。
再来一个问题,厚海网 我把它右侧那栏同类热门给 display 掉,然后想调整正文栏的宽度,使用这种规则,但是不成功。
{
"name":"厚海网",
"url":"^http://www\\.houhaiwang\\.com",
"pageElement":".col-a1>.row-b7",
"css":".col-a2{display:none}.col-a1{width:auto}",
"pageBarText":1,
"nextLink":".col-d3>span>a"
}
需要这样写"css":".col-a2{display:none}.cover .ui-35 .col-a1{width:auto}"
或者加上important,不然优先级不够
嗯,优先级问题搞定了。
还想再请教下 晋江 的问题,在使用延时 1000 毫秒的规则抓内容的螩,有些章节评论还没加载出来,就过了一秒,评论自然没有了。当然,可以调 wait 的时间,但这样显得有点呆。所以想问下,有没有一个判断机制,首先是用 "wait":"return doc.querySelector('#comment_list>div,#lockpage')"
这个条件触发,超时 10 秒后如无内容就通过 "wait":"1000"
来触发。这样是不是好点?
基于如下规则:
{
"name":"晋江文学城",
"url":"^http://www\\.jjwxc\\.net",
"pageElement":"body>table,div.tc,#lockpage",
"pageBarText":1,
"action":1,
"wait":"return doc.querySelector('#comment_list>div,#lockpage')"
}
上面只是为了方便你以后复用到其他网站才这样写的。因为觉得如果加入代码部分对多数用户来说就太复杂了。如果想要完美,可以反向判断。例如
{ "name":"晋江文学城", "url":"^http://www\\.jjwxc\\.net", "pageElement":"body>table,div.tc,#lockpage", "pageBarText":1, "action":1, "wait":"return !doc.querySelector('#comment_list>img')" }
看样子是网络出错了。我看了下,这个站的正文是静态的,所以一般不可能有这样一个瞬间,正好只加载了一行正文,应该是下一页只加载了一半连接就中断了。
也许是触发了这个站的反cc所以连接被强行断开了?
如果是这样的话,可以添加一个sleep属性,限制翻页速度,例如
{ "name":"晋江文学城", "url":"^http://www\\.jjwxc\\.net", "pageElement":"body>table,div.tc,#lockpage", "pageBarText":1, "action":1, "wait":"return !doc.querySelector('#comment_list>img')", "sleep":1000 }
不过我这边尝试用晋江文学城的《康乐天下》翻了50页也没有触发限制,也不能确定就是这个原因。
上面问题翻篇吧。我尝试在 哈西文学网 跑脚本,有新问题。
首先,使用 css 语法,规则如下:
{
"name":"哈西文学网",
"url":"^https://www\\.haxi88\\.com",
"type":1,
"pageElement":"div#BookCon",
"pageBarText":1,
"action":1
}
它可以读取标题和正文内容。我把前面规则换成 xpath 语句:
{
"name":"哈西文学网",
"url":"^https://www\\.haxi88\\.com",
"type":0,
"nextLink":"//a[contains(text(),'下一页')]|//a[contains(text(),'下一頁')]|//a[contains(text(),'下一章')]",
"pageElement":"div[@id='BookCon']",
"pageBarText":1
}
action=0
的时候翻页速度快一些。"nextLink":"//a[contains(text(),'下一页')]|//a[contains(text(),'下一頁')]|//a[contains(text(),'下一章')]"
这一段在 css 的等价描述是怎样的?提前感谢大佬答疑了,拜谢。
这个规则的主体框架写错了。xpath 需要这样写//div[@id='BookCon']
,必须要指定根目录才行。
至于 xpath 的 contains 是无法用 css selector 模拟的,所以我才会添加 xpath 和 css 两种抓取方式
action:1的时候会模拟页面,使得一些必须执行js代码才能显示的动态赋值元素(你可以理解为上面的评论那一种)被抓取到,所以速度不如action:0
还有个疑问,正确用法是 "sleep":1000
还是 "sleep":"1000"
?
因为有默认智能翻页存在呀,无规则下也是能驱动的。
至于晋江文学城的问题,我猜测你本地已经有多个重复的规则了,所以新规则被旧规则抢占了。你检查一下你的自定义规则框试试?
"sleep":1000 与 "sleep":"1000" 都是可以的,我做过兼容,效果也一样
跟你那边的结果不一样。只保留晋江规则、只运行永页机脚本,只开油猴扩展,我这儿仍然有断章问题,它是概率事件,有时候也能翻到50章,有时候就能看到会有章节只翻了几行卡住。
再问个问题,完全没思路。纵横中文网手机端 能编写规则吗?永页机的自动规则没有普及到这里,自己写的话 nextLink 又无从下手,犯难。
这个规则需要配合最新版脚本使用
{ "name":"纵横中文网手机版", "url":"^https://m\\.zongheng\\.com/h5/chapter", "type":0, "pageElement":"//div[@class='title']|//div[@class='text']", "nextLink":"//div[contains(text(),'下一页')]|//div[contains(text(),'下一章')]", "wait":500, "css":".text>div,#fukerr_bot,#fukerr{display:none!important}", "pageBarText":1 }
感谢大佬,完美运行。这样看起来 xpath 对下一章的寻找好像更在行啊。
这里我还有个疑问:为什么一定要添上 "wait":500
这一项?之前我也没想过需要 wait 属性,看规则好像去掉它未尝不可,但实际上删掉它永页机就翻不动了。
因为永页机需要遍历规则,有些页面逻辑是页面加载完毕500ms执行的,有些页面逻辑是页面加载完毕5000ms执行的,永页机不可能一直等下去。如果没有wait,检测不到主体框架就会跳过当前规则了。
所以这一类页面加载完毕后框架还不存在的情况就需要wait了。
换句话说,这个网站要抓取和拼接的元素是动态的?点击下一章瞬间,div.text 还不存在?等待 500 毫秒后,页面才加载出来的它?这样理解对吗?
但是现在的网速这么快,加载时间极短,甚至察觉不到它是需要有一个动态加载过程的,怎么分辨它是静态网页或是需要有一定时间才加载完的动态网页呢?(换句话说就是我什么时候知道要加 wait 属性呢?)
最简单的方法是ctrl+U,打开页面源代码,查看里面是否有框架。如果没有就是动态载入的。
当然你也可以先尝试翻页,抓不到再添加wait
好了,我的问题到这儿也告一段落,应该也足够一般使用了。
谢谢大佬这几天对菜鸟的耐心教学,真是个很好很好的好人,无以为报,有用得上的地方尽管叫我。
ps:大佬,你没想过把你的永页机规则写一个更详细直白的 tutorial 吗?这么强大的脚本值得被更多人使用,我想以后总有一天他们会需要用到这份规则的规则的。
我精力有限,而且有点不擅长写文档,虽然我确实有这个意向,也确实写了一个文档。
但一些我闭门造车构造的流程未必能整理得像商业作品一样。写出来也不一定通俗易懂。所以我没继续把精力放在文档上,而是希望用户能在我写的范例中找到类似的,然后直接copy。
想向大佬提个请求。这个脚本能不能设置一个接口,让用户可以直接选择网页的拼接起点和终点?
比如说,像这个17K的网址:https://www.17k.com/chapter/3381946/45309702.html
现行脚本功能是它会自动智能拼接小说正文内容,但如果我想保留小说标题和正文后的评论的话,有没有办法呢?(不想改油猴脚本的代码)