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

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


3 小时前
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册:2014-5-20
收藏
得分:0 
19楼提速更新
3 小时前
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册: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编辑过]

3 小时前
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册: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>'); 这句要理解清楚,意思是生成由两个换行作为分隔符的数组,数组包括空元素(空行)。
1 小时前
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:335
专家分: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.纯文本分析,不需要浏览器去渲染,往往用exp提取内容 2.然浏览器去渲染,等渲染完去爬取结果,当然往往使用无头浏览器速度会快一些)

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

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

55 分钟前
快速回复:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
数据加载中...
 
   



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

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