| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 657 人关注过本帖
标题:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
只看楼主 加入收藏
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1069
专家分:1657
注 册:2021-10-13
收藏
得分:0 
以前没有太关注反爬技术,现在总算接触到了。我在想,既然有利用js打乱文章正常顺序的反扒技术,那么我们是不是可以把包含js代码的网页交由js解析器先解析,得到纯HTML的网页后再爬取文字内容呢?这样就避免了人家改了排序逻辑我们代码就无效的问题了!

说到反扒技术,我想起之前有人想根据书籍的条形码获取书籍信息的文章,国家图书馆的反扒技术是动态改变链接地址,只有网页上点击搜索才会跳出一个正确链接,若是爬取了这个链接,下次使用又不对了!这个反扒技术该如何破解,请大侠们赐招
5 天前 11:01
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏
得分:0 
“反爬”是相对的。
看源代码有帮助,用 DevTools 工具。
“反爬”通常是对解析器有限制,如果不是按他的要求正常浏览,解析结果也不正常。
所以hmtl文本载入解析器之前最好要禁止解析器执行脚本(禁止之后就不能执行脚本了),但可以试试嵌入脚本代码执行或用解析器执行脚本代码。
见过有些网站要用指定浏览器,用其他浏览器进去会提示用他指定的浏览器。




[此贴子已经被作者于2025-12-10 16:07编辑过]

5 天前 11:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏
得分:0 
19楼提速更新
5 天前 11:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏
得分:0 
回复 20楼 yiyanxiyin
19楼更新速度明显加快。
慢的问题不在 WinHttp.WinHttpRequest.5.1,也不在 htmlfile。
看了一下MS的相关文档,对于类似这些COM对象的使用通常只需 CreateObject 一次实例就可以,除非是多线程或多进程通讯才需要 CreateObject 多个实例。
使用解析器(htmlfile)的好处是应变能力强,取数通过 id、tag、class 对象进行,比较可靠,网页设计通常不会随便去改这些对象。相对用vfp函数去解析html文本,变数会大些,速度也较慢,尤其是对一些数据量大的JSON解析。



[此贴子已经被作者于2025-12-10 13:34编辑过]

5 天前 12:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏
得分:0 
以下是引用yiyanxiyin在2025-12-9 13:48:14的发言:

对就这个意思, 不需要任何js支撑, 直接vfp代码倒腾纯文本

要看具体情况,相对来说,用JS代码比用VFP代码速度快些,效率高些。也不用写那么多代码,随手可得。
但这个小说站的脚本也有点怪,看看他的解码函数:
程序代码:
function _ii_rr(content) {
    content = window.atob(content);
    var arrays = new Array();
    arrays = content.split(',');
    var $chapter = document.getElementById("chapter").innerHTML;
    console.log($chapter);
    document.getElementById("chapter").innerHTML = $chapter.replace(new RegExp(/\[(.*?)\]/), '$1');
    $chapter = $chapter.replace(new RegExp(/\[.*?\]/), '');
    var datas = [];
    datas = $chapter.split('<br><br>');
    var $html = '';
    var el = arrays[0];
    var len = datas.length;
    for (var i = 1; i <= len; i++) {
        $html += datas[arrays[i] - el] + '<br/><br/>';
    }
    document.getElementById("ad").innerHTML = $html;
    document.getElementById('chapter').style.color = '#FBF6EC';
    document.getElementById("chapter").style.height = "5px";
    document.getElementById('chapter').style.display = 'none';
}

其中 console.log($chapter); 这句就有点费解?与控制台有什么关系,会减速。
只爬的话,下面几句多余的。
    console.log($chapter);
    document.getElementById("chapter").innerHTML = $chapter.replace(new RegExp(/\[(.*?)\]/), '$1');
    document.getElementById('chapter').style.color = '#FBF6EC';
    document.getElementById("chapter").style.height = "5px";
    document.getElementById('chapter').style.display = 'none';
不管用什么代码去解析, datas = $chapter.split('<br><br>'); 这句要理解清楚,意思是生成由两个换行作为分隔符的数组,数组包括空元素(空行)。
5 天前 13:57
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:341
专家分:2327
注 册:2023-6-29
收藏
得分:0 
http = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
html = CREATEOBJECT("htmlfile")
这两个组件的主要区别就是, 第一个不会解析html和js(不会执行_ii_rr()这个js函数,也就是_ii_rr()需要自己实现,才能按正常顺序获取到小说内容), 第二个会.  使用第一个适合做文本分析,而不是操作html, 它仅仅将静态html内容下载下来,后面要爬什么都要自己分析文本,不用说性能肯定更高,第二个组件会渲染html,包括执行js(所以可以在等到页面js执行完成后再读html,也就是等那个_ii_rr()执行完成,那么这个时候读到的小说内容就是按正常顺序显示的), 所以用第一个组件可以不用第二个,  如果系统版本低,比如是xp,可能不能正常渲染html和js,就只使用第一个组件就可以了, 第二个组件能用的化,在某些时候明显更方便,但有时候却不适用

既然用了第二个,那么就应该等到js执行完再去取ad的内容就行了,没必要自己去实现_ii_rr()

这就是比较明显的爬虫的两种不同的技术嘛(1.纯文本分析,不需要浏览器去渲染,往往用regexp提取内容 2.然浏览器去渲染,等渲染完去爬取结果,当然往往使用无头浏览器速度会快一些)

另:console.log($chapter);这个仅仅是方便在浏览器控制台查看信息,不开控制台对性能基本没任何影响

[此贴子已经被作者于2025-12-10 16:47编辑过]

收到的鲜花
  • sam_jiang5 天前 16:06 送鲜花  1朵  
5 天前 14:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏
得分:0 
回复 26楼 yiyanxiyin
Windows HTTP 服务主要包含两大部分:WinHTTP C/C++ API 和 WinHttpRequest 对象。
WinHttpRequest 对象是封装了 WinHTTP API 的 COM 对象。

htmlfile 对象主要部分是MSHTML的脚本对象接口 IHTMLDocument2 对象,相当于IE的Document对象,Document对象见得多了。
IE核心主要是有 Windows HTTP 服务和 MSHTML。
Windows HTTP 起网络通信,HTTP协议也是基于TCP/IP协议。
MSHTML 起解析执行 html 文本。

所以,WinHttp.WinHttpRequest.5.1 与 htmlfile 是有紧密关系的,不可孤立看待。
5 天前 15:53
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1069
专家分:1657
注 册:2021-10-13
收藏
得分:0 
回复 26楼 yiyanxiyin
受教了,原来第二个组件可以等待js执行完啊!有空试试看!
5 天前 15:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10951
专家分:43591
注 册:2014-5-20
收藏(1)
得分:0 
简单嵌入脚本代码示例,看看是不是很简单。
如果原脚本代码没什么问题可以直接下载用。
程序代码:
** 测试用 JS 代码,参考 http://www./js/zepto.js 修改。
** 模拟写 JS 文件,实际应用通常先写好 JS 文件。
TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
    <script>
    var content = document.getElementById("ad").innerText;
    eval(content);

    function _ii_rr(content) {    
        content = window.atob(content);    
        var arrays = new Array();    
        arrays = content.split(',');    
        var $chapter = document.getElementById("chapter").innerHTML;    
        $chapter = $chapter.replace(new RegExp(/\[.*?\]/), '');    
        var datas = [];    
        datas = $chapter.split('<br><br>');    
        var $html = '';    
        var el = arrays[0];    
        var len = datas.length;    
        for (var i = 1; i <= len; i++) {        
            $html += datas[arrays[i] - el] + '<br/><br/>';    
        }    
        document.getElementById("ad").innerHTML = $html; 
    } 
    </script>
ENDTEXT
jsFile = "C:\_temp\jscode.js"
STRTOFILE(jsCode, jsFile)
** 模拟写 JS 文件结束

** 爬代码
cUrl = "http://www./6780946/3664234966.html"
http = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
http.open("GET", cUrl, 0)
http.send()
IF http.status != 200
    RETURN
ENDIF
dom = CREATEOBJECT("htmlfile")
dom.write(STRTRAN(http.ResponseText, "script", "soript"))
dom.writeln(FILETOSTR(jsFile))
outFile = "C:\_temp\tmp.txt"
STRTOFILE(dom.getElementById("ad").innerText, outFile)
MODIFY FILE (outFile)
CLEAR ALL 
RETURN
收到的鲜花
  • sam_jiang5 天前 16:06 送鲜花  1朵  
5 天前 15:58
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1069
专家分:1657
注 册:2021-10-13
收藏
得分:0 
回复 29楼 吹水佬
这样就可以了吗?
5 天前 16:06
快速回复:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025047 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved