php抓取网页动态数据(IT行业,支撑业务的变化需要优秀的大量的数据)
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功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |