展开浏览全文类网页的爬虫心得

 

写在前面

来看这个例子

泗州僧伽塔原文、翻译及赏析、朗读_苏轼古诗_古诗文网;

需要点击展开阅读全文才能看全部的译文, 想想有没有好点的办法.

分析

打开调试, 发现这个按钮指向了 js 文件的一个函数, 具体看看:

<a style="text-decoration:none;width:640px;float:left; margin-bottom:10px;" href="javascript:fanyiShow(55737,'54A7CCDBFC8A6D3B')">展开阅读全文 ∨</a>

在 source 里面看 js 文件

//译赏展示
function fanyiShow(id, idjm) {
    if (getCookie('gsw2017user') == null) {
        window.parent.window.location.href = "/user/login.aspx?from=" + encodeURIComponent(window.location.href);
    }
    else {
        document.getElementById('fanyi' + id).style.display = 'none';
        document.getElementById('fanyiquan' + id).style.display = 'block';

        var xmlhttp;
        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        }
        else {// code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                if (xmlhttp.responseText == "未登录") {
                    window.parent.window.location.href = "/user/login.aspx?from=" + encodeURIComponent(window.location.href);
                }
                else {
                    document.getElementById("fanyiquan" + id).innerHTML = xmlhttp.responseText;
                    //如果正在播放
                    if (document.getElementById('fanyiPlay' + id).style.display == "block") {
                        document.getElementById('speakerimgFanyiquan' + id).src = "https://ziyuan.guwendao.net/siteimg/speak-erOk.png";
                    }
                }
            }
        }
        xmlhttp.open("GET", "/nocdn/ajaxfanyi.aspx?id=" + id + "&idjm=" + idjm, false);
        xmlhttp.send();
    }
}

直接把函数的 if 里面==改成!=不就绕过登陆了吗

此时点击展开就能直接看内容了, 然后还能看看 xhr 请求:

https://so.gushiwen.cn/nocdn/ajaxfanyi.aspx?id=55737&idjm=54A7CCDBFC8A6D3B

发现这就是之前调用函数时候的 id 和 idjm.

那爬虫写起来就方便了, 直接组装 Ajax 即可.