阅读:1931回复:24
tampermonkey 如何获取 这个网址的的文章正文内容
像起点的很简单,例如这个页面 https://read.qidian.com/chapter/YpTCe7ZNThACpOPIBxLXdQ2/83iDwee_bG6aGfXRMrUjdw2/
我用 bookname = $("#bookImg").text(); chapname = $(".content-wrap").text(); chaptext = document.querySelector(".read-content"); 就能获取 书名 章节名称 正文内容 但是下面这个网址的不知道如何获取 https://chuangshi.qq.com/bk/xh/AGwEMl1nVjYAOFRtATMBZg-r-1.html 我只会获取 书名 let test2 = $(".bookNav").contents().eq(6).text(); 谁帮我写个代码 获取章节名称 和 正文内容,谢谢 |
|
1楼#
发布于:2023-04-12 15:13
|
|
2楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() { var chapname="abc"; (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); console.log(chapname+"这的代码怎么是最后运行啊") })() console.log(chapname+"这是后面的代码怎么先运行啊,我想后运行啊")我不会弄这个执行顺序,我想通过函数得到chapname等,然后后续进行一些处理, 可是好像是后面的代码都执行完了才运行function x()...怎么搞下才行 |
|
3楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。第一种通俗易懂我是明白的,但是我需要合并好几个网站, 就是 if 是1号网站 获取 书名 章节名称 正文内容 if 是2号网站 获取 书名 章节名称 正文内容 if 是3号网站 获取 书名 章节名称 正文内容 统一处理一下 最终重构一个简单的网页 document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>` 所以需要第二种 第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容 alert(chapname) alert(chaptext) 都是空的 什么都没有显示 帮忙修正下吧 或者 我哪里搞错了... |
|
4楼#
发布于:2023-04-13 12:17
taoww:你能用第二种方式,那就也能用第一种方式。两者在执行上是等价的,最多就是第一种可能会写出多重嵌套的函数不太好看而已。而且按你的需求,也碰不上多重嵌套,直接用一个函数来作最终处理就行了if (location.hostname == "a.co...回到原帖谢谢,这样把后面所有内容变成一个函数确实可以 但是第二种似乎不是概率事件,无限循环无法跳出,我弄了个test变量,他就不停地++,无法获取正确的章节名称 我不会换正确的if条件...,还是希望这个第二种能够实现,我好像进死胡同了 // ==UserScript== // @name test // @version 0.01 // @description test // @match https://chuangshi.qq.com/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; let test=1; async function waitChapter() { await new Promise((resolve)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { console.log(test++) setTimeout(x, 100); return; } resolve(); })(); }); } waitChapter(); let chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); let bookname = $(".bookNav").contents().eq(6).text(); document.body.innerHTML = ` ${bookname} ${chapname} `; })(); |
|
5楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样完美!!! 这样我原先的代码 就99.999%都不用动了,感谢费时费力多番修改~ 从结果来看,就是第一行 (function() { 变成 (async function() { 然后增加新代码 等待载入, 其它照旧,perfect await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); });虽然 完全不懂 async await promise,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^ |
|
6楼#
发布于:2023-04-13 16:17
|
|
7楼#
发布于:2023-08-07 15:10
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样hello,高手,我又来咯 上次这个代码非常好使 // ==UserScript== // @name testok // @version 0.1 // @description test // @match https://chuangshi.qq.com/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (async function() { 'use strict'; let chaptext; console.log($(".bookreadercontent").length);//没问题 0 await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); console.log($(".bookreadercontent").length);//没问题 1 chaptext = document.querySelector(".bookreadercontent"); document.body.innerHTML = ` <div class="chaptext">${chaptext.innerHTML}</div> `; })();然后另一个网站suiyuexs.com的随意一个页面例如: https://www.suiyuexs.com/read/114583/23686286.html这个网站只要是服务器稍微慢点的情况下,就会 获取不到, 所以我我照猫画虎改了下,没成功, $("#txt").length没有载入的时候就==1了... 还是您帮我改改吧,hehe,下面是不行的代码 // ==UserScript== // @name test // @version 0.1 // @description test // @match https://www.suiyuexs.com/read/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (async function() { 'use strict'; let chaptext; console.log($("#txt").length);//有问题 即使没有加载成功也=1 await new Promise((resolve,reject)=>{ (function x(){ if ($("#txt").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); console.log($("#txt").length);// chaptext = document.querySelector("#txt"); document.body.innerHTML = ` <div class="chaptext">${chaptext.innerHTML}</div> `; })(); |
|
8楼#
发布于:2023-08-09 13:57
|
|
9楼#
发布于:2024-04-05 13:32
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用hello,大神,好久不见,我又来向您求助了 帮忙看下这个链接, https://www.zongheng.com/detail/1203325?tabsName=catalogue 1.如何获取 点击右侧作者名字 或 作者头像 跳转到作者所有作品的链接,就是如何获取这个地址https://home.zongheng.com/people/19335221 2.如何获取 所有章节列表 其他小网站简单用 chaplist = $('#list').html();就行 这个复杂网站用 chaplist = $('.detail-catalog--chapter').html(); 不行,完全看不懂代码 |
|
10楼#
发布于:2024-04-15 16:26
|
|
11楼#
发布于:2024-04-15 18:32
taoww:首先去查看页面源代码,搜索看有没有包含 window.__NUXT__= 这么一段脚本的script。 // ==UserScript== // @name why // @version 0.1 // @description books. // @match https://www.zongheng.com/detail/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; console.log('test'); open("https://home.zongheng.com/people/" + window.__NUXT__.state.detail.detailBook.authorInfo.authorId, "_blank"); document.querySelectorAll('.detail-catalog--chapter .chapter-list--item-main').forEach((a)=>{ console.log(a.textContent) }); })(); 把@run-at设置成了document-start ..没用过..嘿嘿... 搜索window.__NUXT__是有的 window.__NUXT__ = (function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D) { |
|
12楼#
发布于:2024-04-15 18:38
taoww:首先去查看页面源代码,搜索看有没有包含 window.__NUXT__= 这么一段脚本的script。firefox 报错是Uncaught (in promise) TypeError: window.__NUXT__ is undefined safari报错是Unhandled Promise Rejection: TypeError: undefined is not an object (evaluating 'window.__NUXT__.state') |
|
13楼#
发布于:2024-04-15 22:46
taoww:我试了下,是因为tampermonkey实现了个沙盒,你这样写没法取得页面环境中window的属性加上// @grant none确实不报错了,但是console.log(a.textContent)什么也没输出啊,只能输出我加的'test' // ==UserScript== // @name why // @version 0.1 // @description books. // @match https://www.zongheng.com/detail/* // @require https://code.jquery.com/jquery-3.6.1.min.js // @grant none // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; console.log('test'); open("https://home.zongheng.com/people/" + window.__NUXT__.state.detail.detailBook.authorInfo.authorId, "_blank"); document.querySelectorAll('.detail-catalog--chapter .chapter-list--item-main').forEach((a)=>{ console.log(a.textContent) }); console.log('test2'); })(); |
|
14楼#
发布于:2024-04-15 23:23
我猜是需要加入代码等待载入完成,可是我用百度搜到的没成功...
不过,我又测试了您说的第二种办法,成功取得了章节列表 现在就是还存在我提问的第一个问题,这个链接怎么获取 1.如何获取 点击右侧作者名字 或 作者头像 跳转到作者所有作品的链接,就是如何获取这个地址https://home.zongheng.com/people/19335221 |
|
上一页
下一页