加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php抓取网页动态数据(IT行业,支撑业务的变化需要优秀的大量的数据)

发布时间:2023-01-08 10:00:49 所属栏目:PHP教程 来源:互联网
导读: 文章在线采集功能的建站系统(相似软件版本说明软件地址网站建设系统前后历经)
php抓取网页动态数据(IT行业,支撑业务的变化需要优秀的大量的数据)
在IT行业,支持业务变化需要大量优秀的数

文章在线采集功能的建站系统(相似软件版本说明软件地址网站建设系统前后历经)

php抓取网页动态数据(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 时,里面的页面是死页,数据根本不会改变。

老板否认了我php采集类,后来老板通过他的手段发现,运行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 的中文资料很少。

今天老板也跟我说,为什么叫“饭桶”?我默默地笑了笑,说不定真的是操作中的工作,哈哈。. . . .

当我正式进入工作环境,进入互联网行业,尤其??是去年,我深深地意识到,如果我不仔细思考,尝试阅读英文资料,对英文有很深的抗拒,那我就不会想在这里。行业继续混乱。*敏*感*词*孩,你应该理性多于感性,看看你能成为什么样的人.

软文采集系统(数据集中治理与提升数据价值转换效率的思路是一致的)

优采云采集器是一个根据用户提供的关键词,云端自动采集相关文章并发布到用户网站的网站采集器。它能够自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则就可以实现全网采集。采集到内容后,会自动计算内容与所设定的关键词的相关度,只把相关的文章推送给用户。支持标题前缀、关键词自动加粗、插入固定链接、自动提取Tag标签、自动内链、自动配图、自动伪原创、内容过滤和替换、电话号码和网址清理、定时采集、百度主动提交等一系列SEO功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!