前言:经过前几节的准备,我们已经具备了爬虫相关方面的基础知识,对爬虫项目的开启已经跃跃欲试啦!本节我们即将开启爬虫初体验~
(一)一级网页
目标网站:东方财富网http://global.eastmoney.com/
-
首先我们对首页的网站结构进行分析,不难发现所有的二级网页链接都存储在"class=title"下;
-
于是开始尝试把一级网页中的所有二级网页链接爬取下来,以便获得更详细的新闻信息;
引用两个模块:
- 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($);
});
该网站没有屏蔽我们的爬虫,较为轻松地就获取了相应的页面内容
-
接下来用元素选择器来定位到二级链接所在的类,并且遍历href属性来最终获取二级链接;
将以下代码插入request块内:
var seedurl_news;
seedurl_news = $(".title a");
seedurl_news.each(function(i, e) {
var myURL = "";
myURL = $(e).attr("href");
console.log(myURL);
});
获取到所有二级网页链接,并且链接格式非常规整
(二)二级网页
- 为更进一步获取详细信息,我们随机进入一个二级页面右键显示网页源代码,找到想要的结构化信息所存储的位置;
- 分析完后,我们用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);
});
}
进行细节处理后,读取结果非常完美
- 我们不想仅仅是显示出来,更想把它保存下来,使得日后依然可以浏览查阅,于是引入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)。
至此爬虫任务已经全部完成!小结一下:这次爬虫主要是需要对网页结构的耐心分析,加上利用模块的方便操作便可以完成对所想要的网站结构化信息的全部爬取啦!