新闻爬虫及爬取结果的查询网站的实现

一、网站爬虫设计

1 使用的Node.js模块介绍

Request模块

Request模块可以发送GET、POST请求,让http请求变的更加简单。
最简单的一个示例:

//GET请求
var request = require('request');
request('您的请求url', function (error, response, body) {
   
  if (!error && response.statusCode == 200) {
   
    console.log(body) // 请求成功的处理逻辑
  }
});
//POST请求
var request = require('request');
var url="请求url";
var requestData="需要传输的数据";
request({
   
    url: url,
    method: "POST",
    json: true,
    headers: {
   
        "content-type": "application/json",
    },
    body: JSON.stringify(requestData)
}, function(error, response, body) {
   
    if (!error && response.statusCode == 200) {
   
        console.log(body) // 请求成功的处理逻辑
    }
}); 

Request-promise包

request-promise是带有promise支持的,依赖于request的简化版的HTTP请求client。
下面是示例:

//使用request-promise爬取网页
var cheerio = require('cheerio'); // Basically jQuery for node.js

var options = {
   
    uri: 'http://www.google.com',
    transform: function (body) {
   
        return cheerio.load(body);
    }
};

rp(options)
    .then(function ($) {
   
        // Process html like you would with jQuery...
    })
    .catch(function (err) {
   
        // Crawling failed or Cheerio choked...
    });

Cherrio模块

Cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方。

下面是简单的示例:

//示例的HTMl模板
<ul id="fruits">
  <li class="apple">Apple</li>
  <li class="orange">Orange</li>
  <li class="pear">Pear</li>
</ul>

//功能一 解析HTML
var cheerio = require('cheerio'),
$ = cheerio.load('<ul id = "fruits">...</ul>');

//功能二 选择器 $(selector, [context], [root])
$('.apple', '#fruits').text()//Apple
$('ul .pear').attr('class')//pear
$('li[class=orange]').html()//<li class = "orange">Orange</li>

//功能三 属性操作 .attr(name, value)
$('ul').attr('id')// fruits
$('.apple').attr('id', 'favorite').html()
// <li class = "apple" id = "favorite">Apple</li>

爬虫过程中使用到的功能总结:

  • $(selector, [context], [root]) 目标选择器
  • .attr(name[, value]) 属性操作
  • .find(selector) 查找满足selector目标选择器的元素。
  • .children([selector]) 获得某元素的子元素,范围为所有子元素。
  • .each(function(index, element){…}) 将每一个元素传入函数并执行。
  • .map(function(index, element){…} 将每一个元素传入函数并执行,并返回值。
  • .eq(i) 根据索引获得cheerio集合中的一个对象。

lconv-lite模块

Iconv-lite模块用于转换编码格式,防止爬取内容乱码

下面是示例:

var iconv = require('iconv-lite');
body = iconv.decode(body, 'gbk');//将body由GBK编码转码为utf-8编码

2 目标网站的分析

网站HTML结构分析(以东方财富网为例)

这一部分内容是使用cheerio模块,基于对网页HTML的分析,找到需要信息的具体位置,使用cherrio的目标筛选器属性操作等等来进行筛选,得到需要的信息。
在这里插入图片描述

东方财富网一级页面
一,通过检查网页源码,发现需要的新闻标题、链接都集中在class=nlist的div中,先尝试爬取一个标题和链接。

//关键代码如下
 var news={
   };
 var item = $('div[class="nlist"]').find("li").children("a");
 news.title = item.text();
 news.url = item.attr("href");
 console,log(news);

打印结果:
在这里插入图片描述
接下来加入map( ),对每一个元素分别进行处理,爬取到所有的标题和链接。

//关键代码如下
 var item = $('div[class="nlist"]').find("li").children("a");
  item.map(function (idx, element) {
   
    var news = {
   };
    news.title = $(element).text();
    news.url = $(element).attr("href");
    console.log(news);
  }); 

打印结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值