Node.js爬虫一站到底系列四实战篇:小试牛刀——爬虫初体验

前言:经过前几节的准备,我们已经具备了爬虫相关方面的基础知识,对爬虫项目的开启已经跃跃欲试啦!本节我们即将开启爬虫初体验~

(一)一级网页

目标网站:东方财富网http://global.eastmoney.com/

  1. 首先我们对首页的网站结构进行分析,不难发现所有的二级网页链接都存储在"class=title"下;
    在这里插入图片描述

  2. 于是开始尝试把一级网页中的所有二级网页链接爬取下来,以便获得更详细的新闻信息;

    引用两个模块:

  • request模块:模拟浏览器请求,将网页内容下载下来;
  • cheerio模块:抓取页面,以在服务器端使用jquery的方式操作DOM结构。
var source_name = "东方财富";
var seedURL = 'http://global.eastmoney.com/';
var request = require('request');
var cheerio = require('cheerio');

request(seedURL, function(err, res, body) {
    var html = body;
    var $ = cheerio.load(html);
    console.log($);        
});

该网站没有屏蔽我们的爬虫,较为轻松地就获取了相应的页面内容
在这里插入图片描述

  1. 接下来用元素选择器来定位到二级链接所在的类,并且遍历href属性来最终获取二级链接;

    将以下代码插入request块内:

	var seedurl_news;
    seedurl_news = $(".title a");
    seedurl_news.each(function(i, e) { 
    var myURL = "";
    myURL = $(e).attr("href");
    console.log(myURL);               
    });

获取到所有二级网页链接,并且链接格式非常规整
在这里插入图片描述

(二)二级网页
  1. 为更进一步获取详细信息,我们随机进入一个二级页面右键显示网页源代码,找到想要的结构化信息所存储的位置;
    在这里插入图片描述在这里插入图片描述
  2. 分析完后,我们用newsGet函数读取每个二级页面详细信息,并创建一个fetch对象以属性的方式存储内容;
//将上一段的代码块中的语句"console.log(myurl);"改为"newsGet(myURL);"
require('date-utils');//为对日期进行格式转化
function newsGet(myURL) { 
    request(myURL, function(err, res, body) {   
        var $ = cheerio.load(body);
        var fetch = {};       
        fetch.url = myURL;
        fetch.source_name = source_name;
        fetch.source_encoding = "utf-8";
        fetch.title = $('title').text();
        fetch.keywords=$('meta[name="keywords"]').eq(0).attr("content");
        fetch.description=$('meta[name="description"]').eq(0).attr("content");       
        fetch.source =$('.em_media').text();
        fetch.content = $('#ContentBody').text().replace(/\s+/g,"");
        //细节处理:爬取下来后发现在内容中有很多空格存在,进行删除处理
        fetch.author = $('.author').text();

        fetch.crawltime =(new Date()).toFormat("YYYY-MM-DD");
        fetch.publish_date= $('.time').text();
        //细节处理:将日期从字符串统一转为Date日期格式
        var regExp = /((\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2})|(\d{4}年\d{1,2}月\d{1,2}日)/
        fetch.publish_date = regExp.exec(fetch.publish_date)[0];
        fetch.publish_date = fetch.publish_date.replace('年', '-');
        fetch.publish_date = fetch.publish_date.replace('月', '-');
        fetch.publish_date = fetch.publish_date.replace('日', '');
        fetch.publish_date = new Date(fetch.publish_date).toFormat("YYYY-MM-DD");
        console.log(fetch);        
    });
}

进行细节处理后,读取结果非常完美
在这里插入图片描述

  1. 我们不想仅仅是显示出来,更想把它保存下来,使得日后依然可以浏览查阅,于是引入fs文件处理模块进行操作,将页面内容单独存储在json文件中;
//别忘了引入模块:var fs = require('fs');
//用以下代码取代上述语句"console.log(fetch)"
var filename = "./new/东方财富news/"+source_name + "_" + (new Date()).toFormat("YYYY-MM-DD") +"_" + myURL.substr(myURL.lastIndexOf('/') + 1) + ".json";
fs.writeFileSync(filename, JSON.stringify(fetch));

文件成功存储!
在这里插入图片描述
打开其中一个文件查看,内容被完整保存了下来,这里可以下载JSON Tools插件来美化json文件显示(command+option+M)。
在这里插入图片描述

至此爬虫任务已经全部完成!小结一下:这次爬虫主要是需要对网页结构的耐心分析,加上利用模块的方便操作便可以完成对所想要的网站结构化信息的全部爬取啦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值