小型新闻爬虫查询网站

小型新闻爬虫查询网站

作业要求

核心需求:

1、选取3-5个代表性的新闻网站(比如新浪新闻、网易新闻等,或者某个垂直领域权威性的网站比如经济领域的雪球财经、东方财富等,或者体育领域的腾讯体育、虎扑体育等等)建立爬虫,针对不同网站的新闻页面进行分析,爬取出编码、标题、作者、时间、关键词、摘要、内容、来源等结构化信息,存储在数据库中。

2、建立网站提供对爬取内容的分项全文搜索,给出所查关词的时间热度分析。

技术要求:

1、必须采用Node.JS实现网络爬虫

2、必须采用Node.JS实现查询网站后端,HTML+JS实现前端(尽量不要使用任何前后端框架)

实例分析

建立SQL

CREATE TABLE `fetches` (
  `id_fetches` int(11)  NOT NULL AUTO_INCREMENT,
  `url` varchar(200) DEFAULT NULL,
  `source_name` varchar(200) DEFAULT NULL,
  `source_encoding` varchar(45) DEFAULT NULL,
  `title` varchar(200) DEFAULT NULL,
  `keywords` varchar(200) DEFAULT NULL,
  `author` varchar(200) DEFAULT NULL,
  `publish_date` date DEFAULT NULL,
  `crawltime` datetime DEFAULT NULL,
  `content` longtext,
  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_fetches`),
  UNIQUE KEY `id_fetches_UNIQUE` (`id_fetches`),
  UNIQUE KEY `url_UNIQUE` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注意到charset定义为utf-8,很多网站(例如网易,就不能直接使用这套table了,如果使用的话需要进行转换)

SQL DML 和 DDL

可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。

SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。

查询和更新指令构成了 SQL 的 DML 部分:

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

SQL 中最重要的 DDL 语句:

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

mysql.js

目的:使用 Node.js 来连接 MySQL,并对数据库进行操作。

var mysql = require("mysql");
var pool = mysql.createPool({
   
    host: '127.0.0.1',
    user: 'root',
    password: 'root',
    database: 'crawl'
});
var query = function(sql, sqlparam, callback) {
   
    pool.getConnection(function(err, conn) {
   
        if (err) {
   
            callback(err, null, null);
        } else {
   
            conn.query(sql, sqlparam, function(qerr, vals, fields) {
   
                conn.release(); //释放连接 
                callback(qerr, vals, fields); //事件驱动回调 
            });
        }
    });
};
var query_noparam = function(sql, callback) {
   
    pool.getConnection(function(err, conn) {
   
        if (err) {
   
            callback(err, null, null);
        } else {
   
            conn.query(sql, function(qerr, vals, fields) {
   
                conn.release(); //释放连接 
                callback(qerr, vals, fields); //事件驱动回调 
            });
        }
    });
};
exports.query = query;
exports.query_noparam = query_noparam;

crawler.js

目的:采集中国新闻网的数据并保存在mysql中

这里的重点是cheerio选择器和简单的正则表达式(之后每个网站都需要重新修改)。

这里梳理一下大致内容

jQuery DOM 选择器:和cheerio很类似,可以先学这个
var myElement = $("#id01"); //返回 id="intro" 的元素
var myElements = $("p"); //返回所有 <p> 元素
var myElements = $(".intro"); //返回 class="intro" 的所有元素
var myElements = $("p.intro"); //返回包含 class="intro" 的所有 <p> 元素的列表。

myElement.text("Hello China!"); //设置 HTML 元素的内部文本
var myText = myElement.text();//获取 HTML 元素的内部文本
var myElement.html("<p>Hello World</p>");//设置元素的 HTML 内容
var content = myElement.html();//获取元素的 HTML 内容

$("body").find("div").eq(2).addClass("blue");//通过为index为2的 div 添加适当的类,将其变为蓝色
cheerio的选择器
//example
<ul id="fruits">
  <li class="apple">Apple</li>
  <li class="orange">Orange</li>
  <li class="pear">Pear</li>
</ul>

$('.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>

$('.pear').removeAttr('class').html() //移除名为name的属性
//=> <li>Pear</li> 

$('.pear').hasClass('pear')//检查元素是否含有此类名
//=> true

$('apple').hasClass('fruit')
//=> false

$('li').hasClass('pear')
//=> true

$('.pear').addClass('fruit').html()//添加类名到所有的匹配元素,可以用函数作为参数
//=> <li class = "pear fruit">Pear</li>

$('.apple').addClass('fruit red').html()
//=> <li class = "apple fruit red">Apple</li>

//移除一个或者多个(空格分隔)的类名,如果className为空,则所有的类名都会被移除,可以传递函数作为参数
$('.pear').removeClass('pear').html()
//=> <li class = "">Pear</li>

$('.apple').addClass('red').removeClass().html()
//=> <
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值