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

优采云 发布时间: 2022-02-27 09:22

  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 时,里面的页面是死页,数据根本不会改变。

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

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

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线