新闻网站爬取汇总、搜索及可视化
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:存放文件的缓存区
- 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());
});
写入文件:
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());}); });
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页面
- 用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 爬虫原理
- 搜索主页面,获取想要的子网页的URL,通过request请求,cheerio解析,each遍历
- 搜索出我们子网页页面中需要的信息:标题,正文等通过request请求,cheerio解析
- 将我们所选要的信息保存下来,通过各种形式访问到这种信息,建立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文件,并导入到前端页面中
- 在项目文件夹下安装mysql模块
npm install mysql --save
- 创建mysql.js
- 在爬虫中引入
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 前端设计展现
- 用表格的形式进行展示,并在title下附有原网址的链接
- 表格翻页及页面跳转实现
3. 数据可视化
3.1 ECharts
3.1.1 简介
Echarts是一个使用JavaScript实现的开源可视化库,可以流畅地运行在PC和移动设备上,兼容当前绝大部分浏览器,底层依赖矢量图形库ZRender,提供直观,交互丰富,可高度个性化定制地数据可视化图表。
简而言之:就是个js文件
3.1.2 基本使用
官网示例学习
使用步骤:
- 下载并引入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>
- 准备一个具备大小的DOM容器
<div id = "main" style = "width: 600px; height:400px;"></div>
- 初始化echarts实例对象
var myChart = echarts.init(document.getElementById('main'));
- 指定配置项和数据(option)
var option = {//标题title: {text: '这是标题文本'},tooltip: {}, //鼠标接触图线显示数据legend: {data:['销量'] //图例组件},xAxis: { data:["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] },yAxis: {},series: [{ //系列列表,有几个对象就表示有几组数据name: "销量", //该组数据名称type: "bar", //表示图标类型data:[5,20,36,10,10,20] //数据}]
};
- 将配置项设置给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上:链接
新闻网站爬取汇总、搜索及可视化相关推荐
- python爬取微博热搜显示到折线图_微博热搜榜前20信息数据爬取进行数据分析与可视化...
一.设计方案 1.主题式网络爬虫名称:微博热搜榜前20信息数据爬取进行数据分析与可视化 2.爬取内容与数据特征分析:爬取微博热搜榜前20热搜事件.排名与热度,数据呈一定规律排序. 3.设计方案概述:思 ...
- python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例
这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...
- Python爬取天气数据及可视化分析!
来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...
- HttpClient 实现爬取百度搜索结果(自动翻页)
如果你对HttpClient还不是很了解,建议先移步我的另一篇博客HttpClient4.x之请求示例后再来看这篇博客.我们这里的项目采用maven搭建.在阅读前要对jdk和maven有一定的了解.另 ...
- 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)
招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...
- 【爬虫】爬取百度搜索结果页面
今日看了一下爬虫,写了一个爬取百度搜索页面的小程序.可以在代码中改动搜索词,代码如下: #coding=utf-8 #python version:2.7 #author:sharpdeepimpor ...
- python爬取百度搜索_使用Python + requests爬取百度搜索页面
想学一下怎样用python爬取百度搜索页面,因为是第一次接触爬虫,遇到一些问题,把解决过程与大家分享一下 1.使用requests爬取网页 首先爬取百度主页www.baidu.com import r ...
- python 异步爬取必应搜索结果
简单的通过异步来爬取必应搜索结果,速度非常可观. 通过用 aiohttp, asyncio这两个异步模块,再通过xpath来提取链接. 加个cookie可以防止爬虫被禁 import aiohttp ...
- Python爬取天气数据及可视化分析
Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...
最新文章
- python polar contour_Python将2darray的最后一行和第二列添加到最后位置 - Polar Contour图...
- golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理
- B. Light It Up
- mysql生活应用_MySQL应用
- python元祖迭代_如何在Python中迭代元组的堆栈
- MIT免费生物信息课程 (代码、文档、数据) - 适合系统学习
- 《C语言程序设计》王希杰 课后答案
- 测试用例-写测试用例时怎么入手
- Ubuntu搭建Anki服务器
- 财务报表五力、五性分析雷达图
- indesign教程,了解图层
- bt 与 ed2k 区别
- 写论文时引用作者名字
- 阿里云开发者大会观后感
- 基于LiDAR里程计和先验地图的定位方法
- 操作数据库方法总结1——JDBC、连接池与JDBCTemplate
- 人脸识别小区门禁系统_小区人脸识别门禁系统安全吗?
- 中原建业冲刺上市的喜与忧:外拓小有成就,增长却逐渐放缓
- sanic 笔记 (概览)
- macOS Catalina 10.15.4(19E266)正式版原版镜像 by OpenCore-0.5.7-03-24编译版
热门文章
- MySQL数据库——MySQL主键(PRIMARY KEY)
- C语言ATM密码次数控制,求助 简单atm机的循环操作
- 中兴ZXA10 F460 V3.0 破解超级密码、Wifi、路由和自动拨号
- 静态网页设计期末大作业 用HTML CSS做一个漂亮简单的个人音乐网页
- YOLOv3 算法的一点理解
- ftp放行端口 linux,Linux中快速架设FTP服务和在 iptables放行FTP
- 京东家电今年将开上万家专卖店,线下PK苏宁国美
- iOS NSKeyedArchiver和NSKeyedUnarchiver
- 如何抓住蝴蝶效应中的那只蝴蝶
- Android studio处理打签名包时报字符资源is not translated的问题