0. 需要的模块

0.1 http包

主要用于搭建HTTP服务端和客户端

0.2 fs包

0.2.1 导入fs模块

var js = require("fs");

0.2.2 同步、异步与回调

所有文件系统操作都具有同步和异步形式

同步:程序在涉及到文件IO时,必须等到文件IO操作结束后再执行后续的操作

异步:程序再涉及到文件IO时,不等待文件IO操作结束,继续执行后续的操作,当文件IO操作结束后系统会通知程序处理文件IO的结果

回调函数:值函数定义后并不立即调用,而是等到某个事件被触发时再调用,具有异步特性

0.2.3 FS模块中常用的函数

读文件:

1.readFile():用于异步读取文件。(非堵塞方式读)

fs.readFile("filename", function(err,buffer){//处理文件的代码
});

filename:文件路径

err:存放的时读文件失败的信息

buffer:存放文件的缓存区

  1. readFileSync():用于同步读取文件,返回一个字符串(文件内容)。(堵塞模式)
var text = fs.readFileSync("filename","utf8");

“filename”:文件名

第二个参数:用来指定字符集,若不指定则函数返回buffer,若指定则返回字符串。

打开文件:

在异步模式下打开文件的语法是:

fs.open(path,flags[, mode], callback);

path:文件路径

flags:打开文件的方式

mode:设置文件模式,但前提是已创建该文件。它默认为0666,读取和写入

callback:回调函数,有两个参数(err,fd).

flags参数的取值:

取值 描述
r 以只读方式打开文件,若文件不存在则报异常
r+ 打开文件进行读取和写入,如果文件不存在则发生异常
rs 打开文件,用于读取,同步方式
rs+ 打开文件进行读取和写入,并告诉OS同步地打开它
w 打开文件进行写入,若文件不存在则创建文件,若文件存在则截断
wx 类似于w,如果路径存在则失败
w+ 打开文件进行读取和写入,若该文件不存在则创建文件,若文件存在则截断
wx+ 类似于w+,但如果文件路径存在则失败
a 向文件中追加内容,若文件不存在则创建文件
ax 类似于a,如果路径存在则失败
a+ 打开文件进行读取和附加,如果文件不存在,则创建该文件
ax+ 类似于a+,如果路径不存在则失败

获取文件信息

它产生一个对象,该对象包含了该文件或文件夹地具体信息。通过该方法,判断正在处理地是一个文件还是一个目录

fs.stat(path,callback);let fs = require("fs");
console.log("开始读取信息!");
fs.stat("input.txt",function (err, stats){if (err) throw err;console.log(stats);console.log("获取文件信息成功");//检查文件类型console.log("是否为文件?" + stats.isFile());console.log("是否为目录?" + stats.isDirectory());
});

写入文件:

  1. writeFile(异步写入文件),如果文件存在则会覆盖文件,语法为:

    fs.writeFile(filename,data[,options],callback);
    

    filename:文件路径

    data:字符串或缓冲区将被写入到文件中

    options:一个对象,用于指定编码方式。默认为UTF8

    callback:回调函数获取一个参数err,用于在发生任何写入错误是返回错误

    let fs = require("fs");
    console.log("开始写入文件");
    fs.writeFile("input.txt","今天是个好日子",function (err){if (err) throw err;console.log("信息写入文件成功");console.log("读取写入的内容");fs.readFile("index.txt",function (err,buffer){if (err) throw err;console.log("文件内容为:", buffer.toString());});
    });
    
  2. writeFileSync(同步写入文件),语法为:

    fs.writeFileSync(filename,要写入文件的内容,'utf8');
    
    let fs = require('js');
    fs.writeFileSync("input.txt","muqi","utf8");
    fs.readFile("input.txt", function(err, buffer){if (err) throw err;console.log("文件内容为:", buffer.toString());
    });
    

二进制方式读取文件(按字节读取):

语法为:

fs.read(fd,buffer,offset,length,position,callback);

fd:通过文件fs.open()方法返回的文件描述符

buffer:被写入数据的缓冲区

offset:偏移量,开始写入缓冲区的位置

length:整数,要从文件中读取的字节数

position:整数,指定从文件中开始读取。如果位置为null,数据将从当前文件位置读取

callback:回调函数获得三个参数,(err,bytesRead,buffer)

let fs = require("fs");
lef buf = new Buffer(1024);
console.log("打开一个文件");
fs.open("input.txt","r+",function(err,fd){if (err) throw err;console.log("打开文件成功");console.log("开始读取文件");fs.read(fd,buf,0,buf.length,0,function(err, bytes){if (err) throw err;console.log("bytes:",bytes);if (bytes > 0){let str = buf.slice(0,bytes).toString();console.log("读取的内容是:", str);}});
});

关闭文件:

fs.close(fd,callback);
//示例
let fs = require("fs");
fs.open("input.txt","r+",function(err,fd){if (err) throw err;console.log("打开文件成功");fs.close(fd, function(err){if (err) throw err;console.log("关闭文件成功");});
});

删除目录:

[方法]((22条消息) Node.js文件系统(fs模块的使用)_橘猫吃不胖~的博客-CSDN博客_node中fs模块怎么引入)

0.3 cheerio

cheerio是nodejs特别为服务端定制的,能够快读灵活地对JQuery核心进行实现,工作与DOM模型上,并且解析、操作、呈现都很高效

0.4 request

GET请求

var url = "https://www.jianshu.com/p/a156729ce499";
//发送GET请求
//第一个参数:请求的完整URL,包括参数
//第二个参数:请求结果回调函数,会传入3个参数,第一个为错误,第二个为响应对象,第三个为请求数据
request(url, function(error, response, data){if (error) throw error;console.log(data);
});

POST请求

post请求有3种方式,由请求头中的content-type决定,属于哪一种post请求

  • application/x-www-form-urlencoded:普通http请求方式,参数是普通的url参数拼接
var url = 'http://192.168.0.102:3000/home?name=xmg';
request.post({url:url, form:{key:'value'}}, function(err, response, data){if (!err && response.statusCode == 200){}
});
  • application/json
var url = 'http://192.168.0.102:3000/home';
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){//doSomething();}
});
  • multipart/form-data
var url = 'http://192.168.0.102:3000/home';
var formData = {my_field: 'my_value',my_buffer: new Buffer([1,2,3]),my_file: fs.createReadStream(_dirname + '/unicycle.jpg')
};request({url:url,formData: formData},function(err,response,body){if (!error && responseCode == 200){//doSomething();}
});

0.5 mysql

mysql常用语句

0.6 Express框架

使用Express可以快速地搭建一个完整功能地网站

核心特性:

  • 可以设置中间件来相应HTTP请求
  • 定义了路由表用于执行不同的HTTP请求动作
  • 可以通过想模板传递参数来动态渲染HTML页面
  1. 用express创建一个web服务器
var express = require('express');
var app = express();app.get('/', function(req, res) {res.send('Hello World');
})var server = app.listen(8081, function() {var host = server.address().addressvar port = server.address().portconsole.log("访问地址为 http://%s:%s", host, port)
})

1. 新闻爬取

1.1 爬虫原理

  1. 搜索主页面,获取想要的子网页的URL,通过request请求,cheerio解析,each遍历
  2. 搜索出我们子网页页面中需要的信息:标题,正文等通过request请求,cheerio解析
  3. 将我们所选要的信息保存下来,通过各种形式访问到这种信息,建立fetch(文件对象),输入文件信息,fs/mysql模块写入

1.2 分析网站链接何网页信息格式

以搜狐新闻为例:

通过网页分析,确定了对应数据的类和链接格式,从而取出

对应的格式代码如下:

本次实验所涉及的新浪新闻、中国新闻网也是采用类似的方法进行修改相应的格式代码

1.3 数据库设计

1.3.1 创建数据库

第一步:下载并安装MySQL

下载链接

  • 将压缩包解压到某个文件夹下,然后以管理员身份打开命令行,在命令行中到达该文件夹下的bin目录下,安装mysql
mysqld -install

  • 初始化mysql

初始化会产生一个随机密码,建议进行更改

  • 启动mysql

第二步:使用mysql

  • 进入mysql

密码为第一步初始化中的随机密码

  • 修改密码为root

  • 输入quit加回车后再用mysql -u root –p 进入mysql,密码为root
  • 给root用户授权从客户端访问

第三步:创建一个数据库crawl,然后再创建一个表fetches

  • create database crawl;
  • use crawl;
  • create table fetches

  • show tables;

1.3.2 创建mysql.js文件,并导入到前端页面中

  1. 在项目文件夹下安装mysql模块
npm install mysql --save
  1. 创建mysql.js

  1. 在爬虫中引入
var mysql = require('./mysql.js');

这样就完成了将爬虫的数据存入数据库的设计了

==注意:==爬取到的一些一些网页某些是内容已经更改,无法访问,故用下面sql语句将这些content为空的数据从数据库中删除

2. 网站搭建

2.1 用express构建网站访问mysql

在terminal中输入:express -e search_site
将之前写好的mysql.js拷贝到该文件夹下并在文件夹内cmd运行:npm install mysql --save将mysql包安装到该项目中,并且将依赖项保存进package.json里

2.2 后端路由设计

根据前端输送过来的关键词从数据库中取出对应的url,source_name,title,publish_date,并将这些数据返回给前端

2.3 前端设计展现

  1. 用表格的形式进行展示,并在title下附有原网址的链接

  1. 表格翻页及页面跳转实现

3. 数据可视化

3.1 ECharts

3.1.1 简介

Echarts是一个使用JavaScript实现的开源可视化库,可以流畅地运行在PC和移动设备上,兼容当前绝大部分浏览器,底层依赖矢量图形库ZRender,提供直观,交互丰富,可高度个性化定制地数据可视化图表。

简而言之:就是个js文件

3.1.2 基本使用

官网示例学习

使用步骤:

  1. 下载并引入echarts.js文件
1、需要npm install echarts-->
<script src="node_modules/echarts/dist/echarts.common.min.js"></script>2、直接通过cdn,不需要下载任何东西
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@4.7.0/dist/echarts.min.js"></script>
  1. 准备一个具备大小的DOM容器
<div id = "main" style = "width: 600px; height:400px;"></div>
  1. 初始化echarts实例对象
var myChart = echarts.init(document.getElementById('main'));
  1. 指定配置项和数据(option)
var option = {//标题title: {text: '这是标题文本'},tooltip: {},    //鼠标接触图线显示数据legend: {data:['销量']   //图例组件},xAxis: {        data:["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] },yAxis: {},series: [{  //系列列表,有几个对象就表示有几组数据name: "销量",  //该组数据名称type: "bar", //表示图标类型data:[5,20,36,10,10,20] //数据}]
};
  1. 将配置项设置给echarts实例对象
myChart.setOption(option);

3.1.3 相关配置

官网手册

grid:直角坐标系内绘图网格

color与series跟的是数组

3.2 相关分析

根据输入内容,在后端中实现在数据库里查询相关的数据条数。

sql语句count()函数学习

  • count(*) (计算包含NULL和非NULL值的行:即所有行)
select count(*) from fetches where source_name = "搜狐新闻";
  • count(DISTINCT val) (忽略重复值)
select count(distinct val) from demos;
  • 具有GROUP BY的MySQL COUNT

即此次实验用到的mysql语句

select source_name,count(*) from fetches group by source_name;

3.3 具体代码实现

3.3.1 后端实现

根据前端输送过来的关键词从数据库中查找,根据数据来源分组,将数据来源与相关的数据条数返回给前端

3.3.2 前端实现

将后端传送来的数据中的source_name存到一个数组,将数据条数传到另一个数组中,然后根据这些数据绘制图表

完整代码已放置个人GitHub上:链接

新闻网站爬取汇总、搜索及可视化相关推荐

  1. python爬取微博热搜显示到折线图_微博热搜榜前20信息数据爬取进行数据分析与可视化...

    一.设计方案 1.主题式网络爬虫名称:微博热搜榜前20信息数据爬取进行数据分析与可视化 2.爬取内容与数据特征分析:爬取微博热搜榜前20热搜事件.排名与热度,数据呈一定规律排序. 3.设计方案概述:思 ...

  2. python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例

    这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...

  3. Python爬取天气数据及可视化分析!

    来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...

  4. HttpClient 实现爬取百度搜索结果(自动翻页)

    如果你对HttpClient还不是很了解,建议先移步我的另一篇博客HttpClient4.x之请求示例后再来看这篇博客.我们这里的项目采用maven搭建.在阅读前要对jdk和maven有一定的了解.另 ...

  5. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)

    招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...

  6. 【爬虫】爬取百度搜索结果页面

    今日看了一下爬虫,写了一个爬取百度搜索页面的小程序.可以在代码中改动搜索词,代码如下: #coding=utf-8 #python version:2.7 #author:sharpdeepimpor ...

  7. python爬取百度搜索_使用Python + requests爬取百度搜索页面

    想学一下怎样用python爬取百度搜索页面,因为是第一次接触爬虫,遇到一些问题,把解决过程与大家分享一下 1.使用requests爬取网页 首先爬取百度主页www.baidu.com import r ...

  8. python 异步爬取必应搜索结果

    简单的通过异步来爬取必应搜索结果,速度非常可观. 通过用 aiohttp, asyncio这两个异步模块,再通过xpath来提取链接. 加个cookie可以防止爬虫被禁 import aiohttp ...

  9. Python爬取天气数据及可视化分析

    Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...

最新文章

  1. python polar contour_Python将2darray的最后一行和第二列添加到最后位置 - Polar Contour图...
  2. golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理
  3. B. Light It Up
  4. mysql生活应用_MySQL应用
  5. python元祖迭代_如何在Python中迭代元组的堆栈
  6. MIT免费生物信息课程 (代码、文档、数据) - 适合系统学习
  7. 《C语言程序设计》王希杰 课后答案
  8. 测试用例-写测试用例时怎么入手
  9. Ubuntu搭建Anki服务器
  10. 财务报表五力、五性分析雷达图
  11. indesign教程,了解图层
  12. bt 与 ed2k 区别
  13. 写论文时引用作者名字
  14. 阿里云开发者大会观后感
  15. 基于LiDAR里程计和先验地图的定位方法
  16. 操作数据库方法总结1——JDBC、连接池与JDBCTemplate
  17. 人脸识别小区门禁系统_小区人脸识别门禁系统安全吗?
  18. 中原建业冲刺上市的喜与忧:外拓小有成就,增长却逐渐放缓
  19. sanic 笔记 (概览)
  20. macOS Catalina 10.15.4(19E266)正式版原版镜像 by OpenCore-0.5.7-03-24编译版

热门文章

  1. MySQL数据库——MySQL主键(PRIMARY KEY)
  2. C语言ATM密码次数控制,求助 简单atm机的循环操作
  3. 中兴ZXA10 F460 V3.0 破解超级密码、Wifi、路由和自动拨号
  4. 静态网页设计期末大作业 用HTML CSS做一个漂亮简单的个人音乐网页
  5. YOLOv3 算法的一点理解
  6. ftp放行端口 linux,Linux中快速架设FTP服务和在 iptables放行FTP
  7. 京东家电今年将开上万家专卖店,线下PK苏宁国美
  8. iOS NSKeyedArchiver和NSKeyedUnarchiver
  9. 如何抓住蝴蝶效应中的那只蝴蝶
  10. Android studio处理打签名包时报字符资源is not translated的问题