nodejs抓取动态网页(如何使用PhantomJS来抓取动态网页,至于PhantomJS是啥啊 )

优采云 发布时间: 2022-01-21 17:17

  nodejs抓取动态网页(如何使用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() 的返回值。以下是刚刚命名的参数和返回的一些附加说明和注意事项。对于整个幻象进程,page.evaluate()运行在沙箱中,fn无法访问幻象域中的所有变量;同样,在 page.evaluate() 方法之外不应尝试访问页面上下文中的内容。那么如果两个scope需要交换一些数据,就只能依靠param和return了。但是限制非常大,param 和 return 必须能够转换成 JSON 字符串,也就是说只能是基本的数据类型或者简单的对象,比如 DOM 节点,$objects,函数,闭包等都无能为力。这种方法是同步的。如果要执行的内容不是后续操作的前端,可以尝试异步方法来提高性能:page.evaluateAsync()。

  了解API后,我们继续工作,修改如下

<p>var page = require(&#39;webpage&#39;).create();

phantom.outputEncoding="gbk";//指定编码方式

page.open("http://news.163.com/", function(status) {

if ( status === "success" ) {

console.log(page.evaluate(function(){

var d = &#39;&#39;;

//匹配 DOM 查询语句

var pattern = &#39;ul li.newsdata_item div.ndi_main div a img&#39;;

var c = document.querySelectorAll(pattern);//查询

var l = c.length;

//遍历输出

for(var i =0;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线