最近使用油猴脚本下载知网学位论文时发现脚本不能正常的下载目录了,因此手动修复一下这个脚本。
通过查看脚本源码和网上搜索发现,脚本使用了jQuery以及油猴的部分接口(比如:GM_xmlhttpRequest,GM_setClipboard等)
在分析源码和查阅脚本的说明后,发现脚本是通过获取知网【分章下载】的网页源码得到每个目录信息的,借助 console.log() 打印GM_xmlhttpRequest请求url发现,知网对分章下载的页面地址进行了更改,脚本原来的请求格式是:
https://chn.oversea.cnki.net/kcms/download.aspx?dbcode=CMFD&dbname=CMFD202102&filename=论文ID.nh
现在改版后的请求格式为:
https://chn.oversea.cnki.net/kcms/detail/downdetail.aspx?dbcode=CMFD&dbname=CMFD202102&filename=论文ID.nh
如果使用原来的请求格式会被知网拒绝放访问,提示错误

于是第一步是修改目录请求url的生成语句,将第81行的语句修改成为

content_url = 'https://chn.oversea.cnki.net/kcms/detail/downdetail.aspx' + content_url.match(/\?.*/)[0];

即可,下图为修改前后对比。
修改前:

修改后:

完成目录页面请求链接修复后,我发现目录下载功能仍然能正常使用,通过查看源码中目录文字生成程序段发现,脚本使用了jQuery完成网页信息的解析。显然,目前页面获取后仍然没能解析出目录信息的原因大概率是知网对页面结构进行了改版,原先的解析方法无法完成新版网页的内容解析,因此,我通过查阅W3school jQuery 选择器的相关介绍,重新修改了目录内容的解析程序,关键参考程序段如下:

function manage_contents(xhr) {// 这段程序主要修改了下面2行var cnt_list = $('ul.list-main', xhr.responseText)[0]; // 目录列表cnt_list = $('li', cnt_list);var contents = get_content(cnt_list); // 目录内容// 添加目录复制$('.btn-dlpdf').first().after($('<li class="btn-dlpdf"><a href="javascript:void(0);">目录复制</a></li>').click(function() {GM_setClipboard(contents); // 运用油猴脚本自带的复制函数window.alert('目录已复制到剪贴板');}));// 添加目录下载$('.btn-dlpdf').first().after($('<li class="btn-dlcaj"><a>目录下载</a></li>').click(function() {var data = new Blob([contents],{type:"text/plain; charset=UTF-8"});$(this).find('a').attr("download", '目录_' + $('.wx-tit h1:first-child()').text().trim() + '.txt');$(this).find('a').attr("href", window.URL.createObjectURL(data));window.URL.revokeObjectURL(data);window.alert("目录索引已保存, 请使用PdgCntEditor软件将目录整合到PDF中");}));
}

另一个修改的地方如下:

function get_content(cnt_list){var contents = "";for (var i = 0; i < cnt_list.length; i++) { var cnt_level = cnt_list[i].getAttribute("class").split("-")[1];var cnt_levelText="";for (var j = 0; j< cnt_level; j++){cnt_levelText = cnt_levelText+"\t";}var cnt_item = cnt_list[i].childNodes[1].childNodes[1];cnt_item = cnt_levelText + cnt_item.innerText;var cnt_page = cnt_list[i].childNodes[1].childNodes[2].textContent.trim().split("-")[0]; // 知网的目录给的是个范围, 正常只需要前半部分contents = contents + cnt_item + "\t" + cnt_page + "\r\n";}return contents;
}

以上程序段修改的地方较多,所以放出原程序段在下方,方便对比。
原程序段:

function get_content(cnt_list){var contents = "";for (var i = 0; i < cnt_list.length - 1; i++) { // 长度减一, 因为最后一个是textvar cnt_item = cnt_list[i].childNodes[1].childNodes[1];cnt_item = cnt_item.innerHTML;var cnt_page = cnt_list[i].childNodes[3].childNodes[0].textContent.trim().split("-")[0]; // 知网的目录给的是个范围, 正常只需要前半部分contents = contents + cnt_item.trim().replace(/&nbsp;/g, " ").replace(/ {4}/g, "\t") + "\t" + cnt_page + "\r\n";}return contents;
}

这2段程序的修改主要涉及到了jQuery选择器的使用,其格式为 $(选择条件,选择对象) ,需要注意的是在缺少选择对象的输入时,jQuery选择器默认操作对象为当前页面的HTML。

目录具体内容解析时,使用到的js方法是 innerTextgetAttribute ,innerText用于获取标签内文字,其与innerHTML的区别在于,innerText仅返回标签内的文本,innerHTML返回的则是整个html标签,形式为‘<…>文本</…>’。

getAttribute用于获取标签特定属性的内容,比如可以使用getAtrribute(“class”)获取标签的class属性。

另外一点需要注意的是,原版程序中使用了“trim()”方法去除目录多余的空格和制表符,如果保留会导致pdf目录信息在新的解析方法中无法分级,所以将这个方法从程序中删除。

完成的修复后的脚本源码如下:

// ==UserScript==
// @id             CNKI_PDF_Supernova
// @name           知网PDF下载助手(修复版)
// @version        3.4.5
// @author         Supernova
// @description    直接以PDF格式从知网下载期刊论文和博硕士论文; 下载博士论文目录; 批量下载文献
// @include        http*://*.cnki.net/*
// @include        http*://*.cnki.net.*/*
// @include        */DefaultResult/Index*
// @include        */defaultresult/index*
// @include        */KNS8/AdvSearch*
// @include        */detail.aspx*
// @include        */CatalogViewPage.aspx*
// @include        */Article/*
// @include        */kns/brief/*
// @include        */kns55/brief/*
// @include        */grid2008/brief/*
// @include        */detail/detail.aspx*
// @exclude        http://image.cnki.net/*
// @run-at         document-idle
// @icon           https://cnki.net/favicon.ico
// @grant          unsafeWindow
// @grant          GM_setClipboard
// @grant          GM_xmlhttpRequest
// @grant          GM_openInTab
// @license        MIT
// @namespace https://github.com/supernovaZhangJiaXing/Tampermonkey/
// ==/UserScript=='use strict';
var $ = unsafeWindow.jQuery;$(document).ready(function() {var myurl = window.location.href;var isDetailPage = myurl.indexOf("detail.aspx") != -1 ? true: false; // 点进文献后的详情页var isContentPage = myurl.indexOf("kdoc/download.aspx?") != -1 ? true : false; // 分章下载if (isDetailPage === false) {// 对应普通检索和高级检索if (window.location.href.indexOf("kns8") != -1 || window.location.href.indexOf("KNS8") != -1){$(document).ajaxSuccess(function(event, xhr, settings) {if (settings.url.indexOf('/Brief/GetGridTableHtml') + 1) {var down_btns = $('.downloadlink');for (var i = 0; i < down_btns.length; i++) {down_btns.eq(i).after(down_btns.eq(i).clone().attr('href', toPDF).css('background-color', '#C7FFC7').mouseover(function(e){this.title="PDF下载";})).css('background-color', '#C7FFFF').mouseover(function(e){this.title="CAJ下载";});}// 在后面新增一个批量下载按钮, 功能为下载pdf格式论文$('.bulkdownload.export').eq(0).after($('.bulkdownload.export').eq(0).clone().html($('.bulkdownload.export').eq(0).html().replace('下载', 'PDF')).removeClass('bulkdownload').click(function () { // 点击下载按钮后的行为// 获取到勾选的文献, 下载其pdf版var down_btns = $('.downloadlink');for (var i = 0; i < $('input.cbItem').length; i++) {if ($('input.cbItem').eq(i).attr('checked') == 'checked') { // 只针对勾选中的iwindow.setTimeout(GM_openInTab(down_btns.eq(2 * i + 1).attr('href')), 1000);}}$.filenameClear();}).css('background-color', '#C7FFC7')).css('background-color', '#C7FFFF').html($('.bulkdownload.export').eq(0).html().replace('下载', 'CAJ'))}$('th').eq(8).css('width', '12%');});}}else {// 只对"博硕论文"详情页做优化, 否则影响期刊页面的显示// 来自: https://greasyfork.org/zh-CN/scripts/371938if (location.search.match(/dbcode=C[DM][FM]D&/i)) {// 整本下载替换为CAJ下载$(".btn-dlcaj").first().html($(".btn-dlcaj").first().html().replace("整本", "CAJ"));// pdf文件的urlvar pdf_url = $(".btn-dlpdf").remove().find("a").attr("href").replace("&dflag=downpage", "&dflag=pdfdown");// 添加PDF下载var pdf_down = $('<li class="btn-dlpdf"><a href=' + pdf_url + ' id="pdfDown" target="_blank" name = "pdfDown"><i></i>PDF下载</a></li>');$(".btn-dlcaj").first().after(pdf_down);// 从分章下载获取目录的URLvar content_url = $(".btn-dlcaj:eq(1)").find("a").attr("href") || '?';//alert(content_url);content_url = 'https://chn.oversea.cnki.net/kcms/detail/downdetail.aspx' + content_url.match(/\?.*/)[0];//alert(content_url);GM_xmlhttpRequest({method: 'GET', url: content_url, onload: manage_contents});// 右侧添加使用说明$(".operate-btn").append($('<li class="btn-phone"><a target="_blank" '+ 'href="https://mp.weixin.qq.com/s?__biz=MzU5MTY4NDUzMg==&mid=2247484384'+ '&idx=1&sn=6a135e824793d26b5bd8884b78c1f751&chksm=fe2a753bc95dfc2d3a5f6'+ '383553fc369894c5021619c85bb7554583bdcb8c10624bf2a7097e1&token=462651491&lang=zh_CN#rd">脚本说明</a></li>'));// 右侧底部添加工具下载(PdgContentEditor)$(".opts-down").append($('<div class="fl info" style="font-size: 13px; border-left: 1px solid #ddd;"><p class="total-inform" style="margin-left: 3px">'+ '<span><a href="https://pan.baidu.com/s/1VoJlEqPnPN8H6oklAZ0bGQ" target="_blank">点击下载目录合并软件及说明</a><br />提取码: y77f</span>'))}}
});// 来自: https://greasyfork.org/zh-CN/scripts/371938
function toPDF() {return $(this).data('PDF', this.href.replace(/&dflag=\w*|$/, '&dflag=pdfdown')).data("PDF");
}function get_content(cnt_list){var contents = "";for (var i = 0; i < cnt_list.length; i++) { // 长度减一, 因为最后一个是text//alert(cnt_list[i].innerHTML);//console.log(cnt_list[i]);var cnt_level = cnt_list[i].getAttribute("class").split("-")[1];//console.log(cnt_level);var cnt_levelText="";for (var j = 0; j< cnt_level; j++){cnt_levelText = cnt_levelText+"\t";}//console.log(cnt_levelText);//break;var cnt_item = cnt_list[i].childNodes[1].childNodes[1];//alert(cnt_item);// console.log(cnt_item);cnt_item = cnt_levelText + cnt_item.innerText;//console.log(cnt_item);var cnt_page = cnt_list[i].childNodes[1].childNodes[2].textContent.trim().split("-")[0]; // 知网的目录给的是个范围, 正常只需要前半部分contents = contents + cnt_item + "\t" + cnt_page + "\r\n";}return contents;
}// 来自: https://greasyfork.org/zh-CN/scripts/371938
function manage_contents(xhr) {var cnt_list = $('ul.list-main', xhr.responseText)[0]; // 目录列表//console.log(cnt_list.innerHTML);cnt_list = $('li', cnt_list);// console.log(cnt_list[0]);//alert(cnt_list);var contents = get_content(cnt_list); // 目录内容// 添加目录复制$('.btn-dlpdf').first().after($('<li class="btn-dlpdf"><a href="javascript:void(0);">目录复制</a></li>').click(function() {GM_setClipboard(contents); // 运用油猴脚本自带的复制函数window.alert('目录已复制到剪贴板');}));// 添加目录下载$('.btn-dlpdf').first().after($('<li class="btn-dlcaj"><a>目录下载</a></li>').click(function() {var data = new Blob([contents],{type:"text/plain; charset=UTF-8"});$(this).find('a').attr("download", '目录_' + $('.wx-tit h1:first-child()').text().trim() + '.txt');$(this).find('a').attr("href", window.URL.createObjectURL(data));window.URL.revokeObjectURL(data);window.alert("目录索引已保存, 请使用PdgCntEditor软件将目录整合到PDF中");}));
}

原版的油猴脚本链接为:https://greasyfork.org/zh-CN/scripts/390733-%E7%9F%A5%E7%BD%91pdf%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B

记录一次修复知网学位论文目录下载油猴脚本的过程相关推荐

  1. 关于知网学位论文检测系统的说明及修改指导意见

    来源:http://www.myxidian.cn/School/Infor/XiDian?inforId=214 第一.知网学位论文检测为整篇上传,上传论文后,系统会自动检测该论文的章节信息,如果你 ...

  2. 知网学术论文下载caj格式转换 caj转pdf

    文章目录 前言 一.海外版知网 二.Zotero用户,使用Zotero Connector便可以直接在非海外版知网下载PDF格式,不论文期刊论文还是硕博论文 三.知网油猴脚本 前言 知网学术论文,特别 ...

  3. 知网博士论文校外查找下载方法

    校外查找下载知网博士论文的方法如下: 1.首先使用文献党下载器(wxdown.org)进入知网,在文献党下载器资源库双击"知网"名称即可进入知网 2.进入知网,输入关键词.篇名.作 ...

  4. 知网查论文时怎么筛选核心期刊?

    在知网检索论文时不知道如何筛选出核心期刊进行查看?解决方法如下图

  5. 油猴脚本第一家,网页网盘链接实时判断+资源搜索网站导航,资源重度患者的福利...

    现在网络上找资源,资源都是存在百度网盘的,大家都知道,百度网盘链接失效的非常之多.遇到网盘链接我们都要一个一个点进去查看链接是否失效,这样操作费时又累人.这时这个油猴脚本就可以帮忙了.实时判断网页中百 ...

  6. (油猴脚本网盘下载加速)

    百度网盘不限速下载方法 一.浏览器安装Tampermonkey扩展 1.1安装扩展 1.2打开扩展 二.安装网盘下载脚本 2.1安装脚本 2.2首次进行验证 三.脚本使用 3.1创建分享链接 3.2下 ...

  7. 油猴脚本——掘金Markdown格式适配器知识点记录【油猴脚本、Markdown、浏览器文件读取、tooltip、SVG、、模拟用户输入、aria-xxxx属性、剪切板操作、】

    油猴脚本--掘金Markdown格式适配器知识点记录 脚本更新日志 参考:掘金Markdown格式适配器更新日志 - 掘金 脚本地址: 更新:2021年9月3日19:57:35 参考:掘金Markdo ...

  8. 记录一次油猴脚本开发的Demo(入门级)、开发过程

    记录一次开发油猴脚本的demo 前言:之前听别人讲油猴脚本怎么怎么地,怎么怎么样,一直以为是个很难的东西,所以在上周五的时候,就自己看了一下,这个东西也不太难.主要还是js玩的6就行了.当然了我的js ...

  9. 中国电信数字中南智慧网自动登录油猴脚本

    中国电信数字中南智慧网自动登录油猴脚本 每次登陆校园网都要输入账号密码再点登陆,于是想自己编写一个油猴脚本自动登录.今天花了半个小时把脚本做出来了,写一篇教程帮助大家. 首先在浏览器上安装油猴插件,推 ...

  10. 油猴脚本第一家,网页网盘链接实时判断+资源搜索网站导航,资源重度患者的福利... 1

    现在网络上找资源,资源都是存在百度网盘的,大家都知道,百度网盘链接失效的非常之多.遇到网盘链接我们都要一个一个点进去查看链接是否失效,这样操作费时又累人.这时这个油猴脚本就可以帮忙了.实时判断网页中百 ...

最新文章

  1. 号称能自动编程60年,“进化计算”究竟进化到哪一步了?
  2. 数据结构 - 简单选择排序法
  3. 信息时代把数据当成了信息,互联网让数据真正发挥出价值,让人们相信人眼看不见的数据世界。...
  4. mongodb安装_Windows系统安装运行Mongodb服务
  5. 计算机二级目录设置,word2设置标题格式,生成目录,奇偶页设置等等,适用考计算机二级办公软件,也适用于毕业论文格式设置...
  6. DOS中的 及 用正则表达式中的什么替掉
  7. 通信(1)---LTE 整体架构
  8. linux中使用gbd进行单布调试
  9. No module named ‘win32gui‘ 的解决方法(踩坑之旅)
  10. [19/06/08-星期六] CSS基础_表格表单
  11. android p 小米6,小米6 想升级 Android P,系统软件工程师发话:可适配
  12. Python关于pandas中 ValueError: Writing 0 cols but got ”XXX“ aliases的错误
  13. Whois接口查询文档
  14. 上海海洋大学计算机专硕调剂,2019年上海海洋大学硕士研究生调剂政策和规则...
  15. qiime2 学习 测序公司返回合并后的数据后续处理
  16. 宇宙是一个无始无终的循环?道翰天琼认知智能机器人平台API接口大脑为您揭秘-2。
  17. 直播带货行业如何入局?先了解一下直播商城源码吧
  18. python redis缓存_第二百九十五节,python操作redis缓存-字符串类型
  19. (六) 数据结构 - 快速排序
  20. WeX5打包项目为app步骤详解

热门文章

  1. RxSwift+Moya之项目实战
  2. LoadBalancer 负载均衡
  3. 20221115使用google文档翻译SRT格式的字幕
  4. shell 中#!/bin/sh 的意思
  5. 杨百翰大学计算机科学专业,杨百翰大学研究生什么专业好
  6. 京东VC后台自动批量上传主图 大聪明自动传主图 c# selenium网页自动化传图
  7. 磁盘空间清理·微信文件夹
  8. 基于核的黎曼编码和字典学习
  9. ESP32-CAM与Tonny搭建问题。
  10. win10系统优化---持续整理中