fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
阅读:1931回复:24

tampermonkey 如何获取 这个网址的的文章正文内容

楼主#
更多 发布于:2023-04-12 08:36
像起点的很简单,例如这个页面 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();
谁帮我写个代码 获取章节名称 和 正文内容,谢谢
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
1楼#
发布于:2023-04-12 15:13
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
感谢帮助,我菜  MutationObserver 完全不知道怎么用
就用你这个~~~~我去捣鼓捣鼓
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
2楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
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()...怎么搞下才行
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
3楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。
alert("这里写你获取内容前要做的事")
(function x() {
  if ($(".bookrea...
回到原帖
第一种通俗易懂我是明白的,但是我需要合并好几个网站,
就是
if 是1号网站 获取 书名 章节名称 正文内容
if 是2号网站 获取 书名 章节名称 正文内容
if 是3号网站 获取 书名 章节名称 正文内容
统一处理一下
最终重构一个简单的网页
document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>`


所以需要第二种
第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容
alert(chapname)    alert(chaptext) 都是空的 什么都没有显示
帮忙修正下吧 或者 我哪里搞错了...
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
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)=&gt;{
      (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}
  `;
  
})();
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
5楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美!!!  这样我原先的代码 就99.999%都不用动了,感谢费时费力多番修改~
从结果来看,就是第一行
(function() { 变成 (async function() {

然后增加新代码 等待载入, 其它照旧,perfect
await new Promise((resolve,reject)=&gt;{
  (function x(){
    if ($(".bookreadercontent").length == 0) {
      setTimeout(x, 100);
      return;
    }
    resolve();
  })();
});
虽然 完全不懂 async await promise,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
6楼#
发布于:2023-04-13 16:17
taoww
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美的代码
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
7楼#
发布于:2023-08-07 15:10
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() {
  'use strict';
 
  let chapname...
回到原帖
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)=&gt;{
    (function x(){
      if ($(".bookreadercontent").length == 0) {
        setTimeout(x, 100);
        return;
      }
      resolve();
    })();
  });
  
  console.log($(".bookreadercontent").length);//没问题 1
  
  chaptext = document.querySelector(".bookreadercontent");
  
  document.body.innerHTML = `
    &lt;div class="chaptext"&gt;${chaptext.innerHTML}&lt;/div&gt;
  `;
})();
然后另一个网站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)=&gt;{
    (function x(){
      if ($("#txt").length == 0) {
        setTimeout(x, 100);
        return;
      }
      resolve();
    })();
  });
  
  console.log($("#txt").length);//
  
  chaptext = document.querySelector("#txt");
  
  document.body.innerHTML = `
    &lt;div class="chaptext"&gt;${chaptext.innerHTML}&lt;/div&gt;
  `;
})();
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
8楼#
发布于:2023-08-09 13:57
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == ""
检查$("#txt")里面有没有文本,或者用
$("#txt").children().length == 0检查$("...
回到原帖
谢谢改写和解答,$("#txt")存在我是知道的,我"盲猜"里面text之类的也是有点什么的 至于里面有什么 有多少 完全不知道不明白  哈哈 就是这么菜
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
9楼#
发布于:2024-04-05 13:32
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == ""
检查$("#txt")里面有没有文本,或者用
$("#txt").children().length == 0检查$("...
回到原帖
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(); 不行,完全看不懂代码
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
10楼#
发布于:2024-04-15 16:26
taoww:看不懂html代码就去学啊,十多年前我也是用firebug边看html结构边学jquery的。现在自带的F12开发工具比当年的firebug强大多了,一年过去了怎么这点长进都没有open("https://home.zongheng.com...回到原帖
两种代码均提示,怎么办,真的蠢,稍微复杂点就歇菜了
Unhandled Promise Rejection: TypeError: undefined is not an object (evaluating 'window.__NUXT__.state')
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
11楼#
发布于:2024-04-15 18:32
taoww:首先去查看页面源代码,搜索看有没有包含 window.__NUXT__= 这么一段脚本的script。
然后考虑你脚本代码的运行时机,必须要等待上面的script执行完后再执行脚本代码。看看你脚本中是不是把@run-at设置成了docume...
回到原帖
// ==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)=&gt;{
    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) {
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
12楼#
发布于:2024-04-15 18:38
taoww:首先去查看页面源代码,搜索看有没有包含 window.__NUXT__= 这么一段脚本的script。
然后考虑你脚本代码的运行时机,必须要等待上面的script执行完后再执行脚本代码。看看你脚本中是不是把@run-at设置成了docume...
回到原帖
firefox 报错是Uncaught (in promise) TypeError: window.__NUXT__ is undefined
safari报错是Unhandled Promise Rejection: TypeError: undefined is not an object (evaluating 'window.__NUXT__.state')
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
13楼#
发布于:2024-04-15 22:46
taoww:我试了下,是因为tampermonkey实现了个沙盒,你这样写没法取得页面环境中window的属性
在// ==/UserScript==之前加一行// @grant        none禁止掉沙盒就能正常工作了。
或者加上
// ...
回到原帖
加上// @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)=&gt;{
    console.log(a.textContent)
  });
  console.log('test2');
 
})();
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-05
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
14楼#
发布于:2024-04-15 23:23
我猜是需要加入代码等待载入完成,可是我用百度搜到的没成功...
不过,我又测试了您说的第二种办法,成功取得了章节列表
现在就是还存在我提问的第一个问题,这个链接怎么获取
1.如何获取 点击右侧作者名字 或 作者头像 跳转到作者所有作品的链接,就是如何获取这个地址https://home.zongheng.com/people/19335221
上一页
游客

返回顶部