一起学爬虫 Node.js 爬虫篇(二)

版权声明:本文为 wintersmilesb101 -(个人独立博客– http://wintersmilesb101.online 欢迎访问)博主原创文章,未经博主允许不得转载。

上一篇中我们对百度首页进行了标题的爬取,本来打算这次直接对上次没有爬取到的推荐新闻进行爬取,谁知道网页加载出来没网页了,这是天要亡我大宋啊。。那我们直接去抓取网易新闻,进入网易新闻,我们要抓取的位置如下:

image

首先来上爬取网站的测试
1.先按下 F12 点击 Network,就会弹出网络请求界面,从这个界面我们看是否有 Ajax 请求,如果有那么就试着伪造请求来获取数据(这样获取的数据很直接,一般都是 json 格式很清晰),伪造不了就使用 pathomjs 来进行网络请求实现抓取。

image

这里可以看到我们的网络请求获取的数据并不为空,那么我们直接对网页的网络加载进行分析,红框的位置就是数据的请求

image

直接拖拽打开请求网址(先点击 header 然后就可以看到网址)

image

打开页面如下

image

,是不是很激动,这不就是数据嘛,还是 json 的,简直比获取网页源码还还解析,直接上代码
var request = require("request");
var cheerio = require("cheerio");
request('http://news.163.com/',function(err,result){
    if(err){
        console.log("错误:"+err);
    }
    console.log(result.body);
})
然后运行测试,可以看到这里我们获取的页面产生了乱码

image

如何解决乱码?有两种方式
1.这里就需要使用到另外的库 superagent 以及 superagent-charset
安装方式
npm install superagent --save
npm install superagent-charset
然后改写代码如下
const install = require('superagent-charset');
const request = require('superagent');
superagent = install(request);
superagent.get('http://news.163.com/').charset('gb2312').end(function(err,res) {
    if(err) console.log(err);
        console.log(res.text);
});
然后运行,如下成功转码

image

2.就直接对 request 配合 iconv-lite
npm install iconv-lite
然后修改代码,如下
var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
request.get({
    url : 'http://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback',
    encoding : null //让body 直接是buffer
}, function (err, response, body) {
    //返回的body 直接就是buffer 了...
    var buf =  iconv.decode(body, 'gb2312');
    console.log(buf);
});
然后运行,如下成功转码

image

终于可以开始进入正题了,我怕拉闸
来解析网页,我们来分析分析要取到合适位置需要做些什么,这是个 json 字符串,结构如下所示
data(
[
  {
    title:'Node.js爬虫爬坑之路',
    date:'2017-03',
    athour:'wintersmilesb101',
    blog:'wintersmilesb101.online'
  }
]
)
所以我们要做如下工作,先把外面的 data() 去掉,然后通过 JSON.parse(String) 把 json 字符串转换成 json 对象,然后我们就可以对变量直接进行操作了,是不是很方便
代码如下,运行
var request = require('request');
var iconv = require('iconv-lite');
request.get({
    url : 'http://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback',
    encoding : null //让body 直接是buffer
}, function (err, response, body) {
    //返回的body 直接就是buffer 了...
    var buf =  iconv.decode(body, 'gb2312');
    //去掉头部的 data_callback(
    var str = buf.replace('data_callback(','');
    //去掉尾部的 )
    str = str.replace(')','');
    //遍历输出数据,输出标题测试
    var str1 = JSON.parse(str);
    str1.forEach(function(s){
      console.log(s.title);
    });
});
成功输出了!接着我们来补全我们的输出

image

修改后代码如下
var request = require('request');
var iconv = require('iconv-lite');
request.get({
    url : 'http://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback',
    encoding : null //让body 直接是buffer
}, function (err, response, body) {
    //返回的body 直接就是buffer 了...
    var buf =  iconv.decode(body, 'gb2312');
    //去掉头部的 data_callback(
    var str = buf.replace('data_callback(','');
    //去掉尾部的 )
    str = str.replace(')','');
    var str1 = JSON.parse(str);
    str1.forEach(function(s){
      console.log('文章标题:'+s.title);
      console.log('摘要:'s.digest);
      console.log('文章链接:'+s.docurl);
      console.log('内容链接:'+s.commenturl);
      console.log('tienum:'+s.tienum);
      console.log('tlastid:'+s.tlastid);
      console.log('tlink:'+s.tlink);
      console.log('标签:'+s.label);
      console.log('时间:'+s.time);
      console.log('新闻类别:'+s.newstype);
      console.log('频道名称:'+s.channelname);
      console.log('图片链接:'+s.imgurl);
    });
});
运行,大功告成,下次我们学习通过 pathomjs 来获取动态网页内容
再贴上几个地址,试试自己练习抓抓,自己也可以找一些其他网站练习,谢谢收看!
1.http://news.163.com/(网易新闻主页,可以练习分析网页的加载)
2.http://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback (提取出来的请求,可以练习 Json 的处理以及中文网页转码)
3.http://news.163.com/special/yaowen_channel_api/?callback=channel_callback&date=0120(就是前面那个再加上了时间戳,也用来练习 Json 处理以及中文网页转码)

image

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值