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

本文记录了修复一个用于下载知网学位论文目录的油猴脚本过程。问题源于知网更新了分章下载页面地址,导致脚本失效。修复包括更新请求URL和调整jQuery选择器以解析新页面结构。修复后的脚本能够正常工作,解析目录信息时使用innerText和getAttribute方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用油猴脚本下载知网学位论文时发现脚本不能正常的下载目录了,因此手动修复一下这个脚本。
通过查看脚本源码和网上搜索发现,脚本使用了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
如果使用原来的请求格式会被知网拒绝放访问,提示错误
image
于是第一步是修改目录请求url的生成语句,将第81行的语句修改成为

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

即可,下图为修改前后对比。
修改前:
image
修改后:
image
完成目录页面请求链接修复后,我发现目录下载功能仍然能正常使用,通过查看源码中目录文字生成程序段发现,脚本使用了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].chi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值