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

来源:互联网 发布:centos 6.9 安全设置 编辑:程序博客网 时间:2024/05/19 03:24

版权声明:本文为 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 --savenpm 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

1 0
原创粉丝点击