php抓取网页动态数据(如何使用PhantomJS来抓取动态网页,至于PhantomJS是啥啊 )
优采云 发布时间: 2021-11-30 07:03php抓取网页动态数据(如何使用PhantomJS来抓取动态网页,至于PhantomJS是啥啊
)
今天我们将学习如何使用 PhantomJS 抓取动态网页。至于 PhantomJS 是什么,看这里我们不讨论 PhantomJS 的基础知识。今天就来抢网易新闻吧。1. 我们先准备一下,打开浏览器,输入网址,分析下图所示的部分。
2.编写获取网页的代码,需要使用网页模块API创建网页如下
var page=require('webpage').create();
看完上面的API,我们首先会得到网页的返回,也就是使用
var page = require('webpage').create();
phantom.outputEncoding="gbk";//指定编码方式
page.open("http://news.163.com/", function(status) {
if ( status === "success" ) {
console.log(page.body);//输出网页
} else {
console.log("网页加载失败");
}
phantom.exit(0);//退出系统
});
输出如下:
可以看到网页的全文已经输出了(现在延迟比较严重,有几秒的延迟,当然我们这里的重点不是这个,之前想跑是不好的我们学会走路),下面我们来分析一下如何获取我们需要的内容,这里我们使用DOM来解析,或者cheerio来解析,看下图
从分析可以看出,我们现在解析的DOM语句可以是这样的
var pattern = 'ul li.newsdata_item div.ndi_main div a';
现在我们要使用DOM语句,这里我们介绍一个网页API
page.open('http://m.bing.com',function(status){
vartitle=page.evaluate(function(s){
returndocument.querySelector(s).innerText;
},'title');
console.log(title);
phantom.exit();
});
##### 在这个例子中,page.evaluate() 接受两个参数,第一个是必须的,表示需要在页面上下文中运行的函数fn;第二个是可选的,这意味着它需要传递给 fn 参数 param。fn 允许返回一个返回值,这个返回值最终作为 page.evaluate() 的返回值。以下是刚刚命名的 param 和 return 的一些附加说明和注意事项。整个幻象过程,page.evaluate()运行在沙箱中,fn无法访问幻象域中的所有变量;同样,在 page.evaluate() 方法之外不应尝试访问页面上下文中的内容。所以如果两个scope需要交换一些数据,就只能靠param和return了。但是,限制非常大。Param 和 return 必须可转换为 JSON 字符串。换句话说,它们只能是基本数据类型或简单对象。例如,DOM 节点、$objects、函数、闭包等都是无能为力的。这种方法是同步的。如果执行的内容不具备后续操作的先决条件,可以尝试一种异步方法来提高性能:page.evaluateAsync()。
了解API后,我们继续工作,修改如下
<p>var page = require('webpage').create();
phantom.outputEncoding="gbk";//指定编码方式
page.open("http://news.163.com/", function(status) {
if ( status === "success" ) {
console.log(page.evaluate(function(){
var d = '';
//匹配 DOM 查询语句
var pattern = 'ul li.newsdata_item div.ndi_main div a img';
var c = document.querySelectorAll(pattern);//查询
var l = c.length;
//遍历输出
for(var i =0;i