php抓取网页动态数据(IT行业,支撑业务的变化需要优秀的大量的数据)
优采云 发布时间: 2022-02-27 09:22php抓取网页动态数据(IT行业,支撑业务的变化需要优秀的大量的数据)
在IT行业,支持业务变化需要大量优秀的数据。我们需要适应数据的动态变化,获取这些动态变化,进行分析,然后提供给我们自己的项目,以支持公司的业务。最近,我遇到了这种情况。需要获取网页上不断变化的数据。只有当数据发生变化时,才会取变化的值并将其存储在库中。
其实PhantomJs,乍一看名字还以为是Js。实际上,它是一个没有页面的浏览器。它与其他浏览器的最大区别在于它没有界面。内核使用WebKit,即PhantomJs。官方网站。PhantomJs中文资料很少,介绍也很简单。基本上,它是来自官方网站的示例。这对我一点帮助都没有。但是,如果人们学会了灵活,他们就只能执行这些简单的程序。组装和组合以支持您的复杂业务。PhantomJs 只是一个浏览器,它不能主动告诉我什么时候数据发生了变化,也就是变化的数据。所以,这也需要 MutationObserver 的支持。
MutationObserver,乍一看名字,或许你能想到它的实现原理。在我看来,这是一种观察者模式。当然,我不知道JS的具体实现细节,也没有查过。事实上,计算机中的许多东西都是相似的。从名字上,你或许能看出它的作用,或者大致猜出它的实现原理。
安装
要使用 PhantomJs,您需要先安装它。详情请参考官网。在使用的时候,我使用了以下 PhantomJs 的方法。
介绍
当然,这是对我使用过的方法的介绍。对于其他人,请访问官方网站。
page.onConsoleMessage *敏*感*词*所有 console.log 消息
page.onConsoleMessage = function(msg){
console.log(msg);
};
page.onLoadFinished接口加载完成后,获取页面的动态数据
page.onLoadFinished = function(status){
console.log('---------start-----------');
page.evaluate(getContent,"test");
};
打开page.open接口,我用了它的两个参数
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('can not start');
} else {
}
});
page.evaluate() 支持js操作
page.evaluate(getContent,postUrl);
getContent是js的方法名,postUrl是方法需要传递的参数
剩下的就是 MutationObserver 对动态数据变化的监控。
function getContent(url) {
console.log("---------start fetch------------"+url+"---");
var tar = $('#MarketGrid');
var MutationObserver = window.MutationObserver|| window.WebKitMutationObserver|| window.MozMutationObserver;
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var text=$(mutation.target).parents(".ipe-Market").find(".ipe-Market_ButtonText").text();
console.log(text);
})
});
observer.observe(tar[0], {
attributes: true,
childList: true,
characterData: true,
characterDataOldValue: true,
attributeOldValue:true,
subtree: true});
}
完整的Js是:
system = require('system')
address = system.args[1];//获得命令行第二个参数 接下来会用到
var page = require('webpage').create();
var url = address;
page.onConsoleMessage = function(msg){
console.log(msg);
};
page.onLoadFinished = function(status){
console.log('---------start-----------');
var postUrl=getUrl();
page.evaluate(getContent,"test");
};
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('can not start');
} else {
}
});
function getContent(txt) {
console.log("---------start fetch------------"+txt+"---");
var tar = $('#MarketGrid');
var MutationObserver = window.MutationObserver|| window.WebKitMutationObserver|| window.MozMutationObserver;
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var text=$(mutation.target).parents(".ipe-Market").find(".ipe-Market_ButtonText").text();
console.log(text);
})
});
observer.observe(tar[0], {
attributes: true,
childList: true,
characterData: true,
characterDataOldValue: true,
attributeOldValue:true,
subtree: true}
);
}
跑步
我安装了 PhantomJs 的 Windows 版本。运行时需要进入对应的bin目录,然后使用命令格式:phantomjs xxx.js http地址。
问题与解决方案
说说我中间遇到的一些问题。
第一个问题:实时监控动态数据变化
一开始,我不明白 PhantomJs 是什么。事实上,我只是不相信它是一个浏览器。它与其他浏览器的区别在于没有界面。其他浏览器功能基本都有PhantomJs,所以当MutationObserver在其他浏览器工作时,与PhantomJs结合使用时,无法产生相应的效果。曾经怀疑无法实现利用这两个东西动态抓取数据的功能。原因是在 page.evaluate() 中间执行 MutationObserver 时,里面的页面是死页,数据根本不会改变。
老板否认了我,后来老板通过他的手段发现,运行page.evaluate()的时候,这个时候页面是不存在的,也没有html元素可能会改变。老大就是老大,不得不佩服。
第二个问题:PhantomJs内存飙升,CPU占用率高
出现这个问题的原因是PhantomJs在运行过程中,由于page.evaluate()中js方法的问题,导致PhantomJs占用的内存越来越多,最后达到1.左右自动关闭退出@>5G。解决方法不用我说,直接调试js,找到导致原因的js。
第三个问题:我看到数据动态变化了,但是动态变化的值还没有拿到。
这个问题的原因其实和第一个问题有些相似,为什么会相似呢?因为我遇到的两个问题都和具体的http请求页面有关。出现这个问题是因为里面的html元素。检测到变化后,取不到值。这个问题非常隐蔽。不仔细观察很难发现。
第四个问题:既然PhantomJs启动后就是一个进程,那么检测到的数据变化值如何传入项目中呢?
有两种类似的解决方案,第一种:Ajax 向项目服务请求;第二种:将线程长时间挂起并保持活跃状态,或者使用main函数。
第五题:管理问题
目前,这还涉及到其他一些问题。如果您使用包类而不使用其他附加工具,您将面临启动数据捕获服务,并将启动 PhantomJs 进程。如果您启动 10 个,您将启动 10 个 PhantomJs 进程。,什么时候开始,什么时候删除PhantomJs的进程,这些都是问题。一个进程占用大约50m的内存。如果是10,就是500m。但是,您可以手动启动和删除它吗?显然这是不合理的,至于如何解决,我稍后会告诉你。
总结
使用 PhantomJs 和 MutationObserver 实现动态网页数据抓取,调整 PhantomJs 和 MutationObserver 大概需要一周时间。当然,这不是最终版本,实际上最终版本比这个稍微复杂一些。PhantomJs 还是有很*敏*感*词*的。在数据抓取行业,我认为 PhantomJs 未来会有很大的发展前景。其实PhantomJs也有对应的打包工具——PhantomJsDriver,但是我查了这个打包工具类的API,没有适合我们特殊需求的,所以没有深入研究,貌似有很PhantomJsDriver 的中文资料很少。
今天老板也跟我说,为什么叫“饭桶”?我默默地笑了笑,说不定真的是操作中的工作,哈哈。. . . .
当我正式进入工作环境,进入互联网行业,尤其是去年,我深深地意识到,如果我不仔细思考,尝试阅读英文资料,对英文有很深的抗拒,那我就不会想在这里。行业继续混乱。*敏*感*词*孩,你应该理性多于感性,看看你能成为什么样的人.