在中国知网下载 PDF 格式的学位论文

在中国知网下载 PDF 格式的学位论文

中国知网真是奇怪,非要自己搞出一个封闭的 CAJ 格式,学位论文还不提供 PDF 的格式,逼着人们只能去下载它们的 CAJViewer,最不可忍受的是竟然没有 Linux 下的版本!

但是群众的智慧是无穷的,最近发现,通过一个 userscript 就可以给学位论文页面加上“PDF 下载”的按钮。

所谓 userscript,就是一个浏览器插件,能够动态地修改页面内容。在 Chrome 浏览器中,需要安装 tampermonkey 插件来管理 userscripts,FireFox 中可以使用 Greasemonkey。

脚本的内容可以从这里获取。原本的域名是 userscripts.org,但这个网站似乎挂了很久了,不过镜像站 userscripts-mirror.org 一直可用。
代码

为了保险,将脚本完整内容复制在此:

    // ==UserScript==
    // @id             CNKI-PDF-Special
    // @name           CNKI 中国知网 PDF 全文下载(特制版)
    // @version        1.25
    // @namespace      http://yuelong.info
    // @author         YUE Long
    // @updateURL      https://userscripts.org/scripts/source/164338.meta.js
    // @description    ① 点击 CNKI 检索结果界面中的下载按钮可以直接下载 PDF 格式文献;
    //                 ② 在硕士/博士学位论文详细信息界面添加“PDF下载”按钮。
    //                 ※ 特制版功能:在检索页面中的硕士/博士论文默认下载 CAJ 文件。
    // @include        http://*.cnki.net/*
    // @include        http://*.cnki.net.*/*
    // @run-at         document-idle
    // ==/UserScript==

    var allLis, thisLi, newLi, aPDF, allLinks, thisLink, pageType;
    pageType = true;

    allLinks = document.evaluate(
        '//a[@href]',
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    allLis = document.evaluate(
        "//li[@class]",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    if (allLis) {
        for (var i = 0; i < allLis.snapshotLength; i++) {
            thisLi = allLis.snapshotItem(i);
            if (thisLi.getAttribute("class").indexOf("readol") !== -1) {
                pageType = false;
                newLi = document.createElement('li');
                newLi.setAttribute("class","pdf");
                aPDF = '<a target="_blank" href="' +
                       thisLi.firstChild.href.replace("&dflag=readonline","&dflag=pdfdown") +
                       '">PDF下载</a>';
                newLi.innerHTML=aPDF;
                thisLi.parentNode.insertBefore(newLi, thisLi.nextSibling);
            }
            if (thisLi.getAttribute("class").indexOf("cajNew") !== -1) {
                pageType = false;
            }
        }
    }

    if (pageType) {
        for (var i = 0; i < allLinks.snapshotLength; i++) {
            thisLink = allLinks.snapshotItem(i);
            if (thisLink.href &&
                thisLink.href.indexOf("download.aspx?filename=") != -1 &&
                thisLink.href.indexOf("&dflag") == -1 &&
                thisLink.href.indexOf("=CMFD") == -1 &&
                thisLink.href.indexOf("=CDFD") == -1
            ) {
                thisLink.href = thisLink.href + "&dflag=pdfdown";
            }
            if (thisLink.href &&
                thisLink.href.indexOf("download.aspx?filename=") != -1 &&
                thisLink.href.indexOf("&dflag") == -1 &&
                (thisLink.href.indexOf("=CMFD") !== -1 || thisLink.href.indexOf("=CDFD") !== -1 )
            ) {
                thisLink.href = thisLink.href + "&dflag=nhdown";
            }
        }
    }

把这段代码添加到 Tampermonkey 中,再访问知网,点开一个学位论文的页面,就能从上面看到“PDF 下载”的按钮了。就像这样:

学位论文可以下载 PDF 格式
关于 Userscript

UserScript 就是一段 JavaScript 代码,当一个页面加载完成之后,这段 JavaScript 就会自动执行,效果就和在调试工具的终端里执行 JavaScript 一样。因此,Userscript 能够访问操作 DOM 节点,能使用页面引用的所有库。

UserScript 通常由浏览器的插件来管理,例如 FireFox 有 Greasemonkey,Webkit/Blink 内核的浏览器则有 Tampermonkey,而且这些工具支持的 UserScripts 接口相同,同样的 UserScript 在不同的管理插件下执行效果相同。

至于代码开头的那一段注释,其实就是这个 Userscript 的元数据,其中描述了代码的名称、版本、作者,以及作用于哪些网页等等。

注:这里是这段带码的原始出处。

这个脚本可以在能够下载CAJ文件的情况下,提供PDF文件的下载链接,这下不用wine CAJViewer了,Ubuntu/Linux用户福音

主要实现了一下两个功能:

    在文献检索结果列表界面中,点击或后,可以直接下载 PDF 文件,而非 CAJ/NH 文件;
    在博士/硕士学位论文详细信息界面添加了“PDF下载”按钮,实现了博士/硕士学位论文的 PDF 下载功能,如下图所示。

脚本使用方法:在 Firefox 中先安装 Greasemonkey 或 Scriptish 扩展后,再安装脚本;在 Chrome 中请参考这篇文章(wu.nerd注:Chrome直接拖到Extensions页面即可);在 Safari 中借助 Ninjiakit 使用(感谢 Heart7)。IE 尚不能使用。

脚本下载地址:http://userscripts.org/scripts/show/162636

UPDATE(2013/04/06):感谢 Troy 的建议,我制作了一个特制版的脚本。其特别之处在于可以在检索页面中的硕士/博士论文默认下载 CAJ/NH 文件,避免了 PDF 文件没有目录所带来的遗憾。

特制版脚本下载地址:http://userscripts.org/scripts/show/164338

P.S. 这段代码实现 PDF 下载的原理并不高神,只是修改了下载链接,改了一些 GET 参数。因此可以推断,CAJ 格式实际上与 PDF 非常相似,知网的服务器可以实现格式的转换。这样转出来的 PDF 是文字版,虽然没有 CAJ 中的目录,基本需求已经完全满足。
原文地址:https://www.cnblogs.com/bishi/p/5698946.html