新闻爬虫及爬取结果查询网站的搭建(一)
新闻爬虫及爬取结果查询网站的搭建(一)
- 实验要求
- 核心需求
- 技术要求
- 爬虫准备工作
- Node.js 安装配置
- vscode
- Request
- Cheerio简介
- 数据库存储
实验要求
核心需求
1、选取3-5个代表性的新闻网站(比如新浪新闻、网易新闻等,或者某个垂直领域权威性的网站比如经济领域的雪球财经、东方财富等,或者体育领域的腾讯体育、虎扑体育等等)建立爬虫,针对不同网站的新闻页面进行分析,爬取出编码、标题、作者、时间、关键词、摘要、内容、来源等结构化信息,存储在数据库中。
2、建立网站提供对爬取内容的分项全文搜索,给出所查关键词的时间热度分析。
技术要求
1、必须采用Node.JS实现网络爬虫
2、必须采用Node.JS实现查询网站后端,HTML+JS实现前端(尽量不要使用任何前后端框架)
爬虫准备工作
一共选了三个新闻网站进行爬虫,分别是中国财经网、雪球网、东方财富网,并且将爬取结果存储在postgresql中。
在本实验中,基于Node.js用Cheerio和Request实现了爬虫。下面将详细介绍基本环境搭配,各个爬虫的实现,功能实现过程等内容。
Node.js 安装配置
node.js官网:https://nodejs.org/zh-cn/
安装非常简单,顺着点一点就好了。
vscode
Visual Studio Code(以下简称vscode)是一个轻量且强大的跨平台开源代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。
在本实验中,我使用的是vscode对node.js进行调试。
可以参考官网:https://code.visualstudio.com/
Request
Request也是一个Node.js的模块库,可以轻松地完成http请求。
- 安装
npm install request - 基本使用方法:
在本实验中,主要是通过request来获取新闻页面。主要使用其默认的GET方法。
var request = require('request');
request('url', function (error, response, body) {if (!error && response.statusCode == 200) {console.log(body) // 请求成功的处理逻辑}
});
Cheerio简介
- Cheerio介绍与安装
cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方。
cheerio官网: https://cheerio.js.org/.
也可以参考中文翻译:https://www.jianshu.com/p/629a81b4e013
安装:在项目目录下执行 npm install cheerio - 主要功能
在本次实验中,主要用到的功能将在本节进行一个简单介绍。
- 解析HTML(load)
首先需要手动加载html文档,使用的方式如下,其他更多的加载方式可以参考官方文档var cheerio = require('cheerio'),$ = cheerio.load('<ul id = "fruits">...</ul>');
- 选择器(selecter)
cheerio选择器几乎和jQuery一模一样。选择器是文档遍历和操作的起点。如同在jQuery中一样,它是选择元素节点最重要的方法,但是在jQuery中选择器建立在CSS选择器标准库上。
在本实验中,主要用到了以下几种选择器方法。
选取页面中所有的超链接。首先获取页面中所有<a>标签,再遍历获取其href属性的值,具体的局部代码如下:try {seedurl_news = $('a');} catch (e) { console.log('url列表所处的html块识别出错:' + e) };seedurl_news.each(function(){try {var href = "";href = $(this).attr('href'); //获取href属性}catch(e) {console.log('get the seed url err' + e);}}
按照指定class属性名称来进行选取,注意在class name中间有空格的时候,选取时改为., 示例代码如下:
$('.source.data-source')
如果要选取某一个标签下,其子标签的内容,但他的子标签并没有唯一的class name 或者id相对应,可以使用.children( selector )来选择其子节点,并且eq()是选择第几个子节点,从0开始。示例代码如下:
$('.article-meta').children().eq(1).text();
数据库存储
概述
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统。
在本实验中,将爬虫得到的数据存储在PostgreSQL中,并且在爬取页面时,对该url是否爬取过进行检查。数据库安装
可以在官网上进行下载,官网连接https://www.postgresql.org/
在windows系统上的安装教程可以参考https://www.yiibai.com/postgresql/install-postgresql.htmlnodejs连接pg数据库
nodejs连接pg数据库有两种方式:
一种是直接连接、操作、断开。
一种是使用连接池,这种方式可以有效提升多并发的效率。
在本实验中,采用的是连接池的方法连接数据库。
首先使用npm安装数据库连接模块:npm install pg
连接池创建
在代码中引入pg模块,并编写数据库配置:var pg = require('pg');// 数据库配置 var config = { user:"postgres",database:"Spider",password:"postgres",port:5432,// 扩展属性max:20, // 连接池最大连接数idleTimeoutMillis:3000, // 连接最大空闲时间 3s }
创建连接池:
// 创建连接池 var pool = new pg.Pool(config);
在本实验中,主要是对数据库进行查询和插入的操作,并没有用更新和删除操作。
在这里主要写了两个函数,用于操作有参数和无参数的情况。
有参数var query = function(sql, sqlparam, callback) {pool.connect(function(err, conn, done) {if (err) {console.log(err)callback(err, null, null);} else {conn.query(sql, sqlparam, function(err, result) {//conn.release(); //释放连接 done();callback(err, result); //事件驱动回调 });}}); };
无参数
var query_noparam = function(sql, callback) {pool.connect(function(err, conn, done) {if (err) {callback(err, null, null);} else {conn.query(sql, function(err, result) {conn.release(); //释放连接 callback(err, result); //事件驱动回调 });}}); };
新闻在数据库中的存储格式
在pgSQL中,运行以下语句,建立存储了url,来源,编码,标题,作者,爬取时间,新闻发布时间,内容,分类,和阅读次数的数据存储schema。CREATE TABLE fetches (id_fetches serial UNIQUE,url text DEFAULT NULL UNIQUE,source_name varchar(50) DEFAULT NULL,source_encoding varchar(45) DEFAULT NULL,title varchar(100) DEFAULT NULL,author varchar(100) DEFAULT NULL,crawltime date DEFAULT CURRENT_TIMESTAMP,publish_date date DEFAULT CURRENT_TIMESTAMP,content text,category text DEFAULT NULL,read_num integer DEFAULT NULL,PRIMARY KEY (id_fetches) );
查看url 是否已经爬取过
将爬取数据进行存储的其中一个目的是,防止重复爬取同一页面。
查询返回的result是一个对象,其中rows是一个存储列名和值的数组,因此判断url是否重复的时候,是判断result.rows[0]是否为null。// not try to crawl the repeat pagevar fetch_url_Sql = 'select url from fetches where url= $1';var fetch_url_Sql_Params = [href];pgsql.query(fetch_url_Sql, fetch_url_Sql_Params, function(err, result) {if (err) {console.log(err)} else { // a new pageif(result.rows[0] != null) {console.log(result.rows[0]);console.log("URL " + href + " repeat");} else {newsGet(href);}}});
将爬虫的结果存储到数据库中
// save the result in postgresql var fetchAddSql = 'INSERT INTO fetches (url, source_name, source_encoding, title, author, publish_date, content, read_num)' + 'VALUES ($1, $2,$3,$4,$5, $6, $7,$8)'; var fetchAddSql_Params = [fetch.url, fetch.source, fetch.source_encoding,fetch.title, fetch.author, fetch.publish_date,fetch.content, fetch.read_num ];//执行sql,数据库中fetch表里的url属性是unique的,不会把重复的url内容写入数据库 pgsql.query(fetchAddSql, fetchAddSql_Params, function(err, result) {if(err) {console.log(err);} });
新闻爬虫及爬取结果查询网站的搭建(一)相关推荐
- python——图片爬虫:爬取爱女神网站(www.znzhi.net)上的妹子图 进阶篇
在上一篇博客中:python--图片爬虫:爬取爱女神网站(www.znzhi.net)上的妹子图 基础篇 我讲解了图片爬虫的基本步骤,并实现了爬虫代码 在本篇中,我将带领大家对基础篇中的代码进行改善, ...
- python爬虫:爬取猎聘网站职位详情
python爬虫:爬取猎聘网站职位详情 第一次学习python,也是刚开始学习爬虫,完成的第一个实例,记录一下. baseurl.py # @author centao # @time 2020.10 ...
- 爬虫实战-爬取房天下网站全国所有城市的新房和二手房信息(最新)
看到https://www.cnblogs.com/derek1184405959/p/9446544.html项目:爬取房天下网站全国所有城市的新房和二手房信息和其他博客的代码,因为网站的更新或者其 ...
- python爬虫自学网站_python爬虫学习 爬取幽默笑话网站
这篇文章主要介绍了python爬虫爬取幽默笑话网站,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 爬取网站为:http://xiaohua.zol. ...
- Search For Free —— 新闻爬虫及爬取结果的查询网站
文章目录 一. 项目概述 1.1 核心需求 1.2 技术要求 二. demo展示 2.1 项目框架 2.2 演示demo视频 三. 网站分析 四.数据爬取 4.1 爬虫整体结构 4.2 使用的工具包 ...
- [python爬虫] selenium爬取局部动态刷新网站(URL始终固定)
在爬取网站过程中,通常会遇到局部动态刷新情况,当你点击"下一页"或某一页时,它的数据就进行刷新,但其顶部的URL始终不变.这种局部动态刷新的网站,怎么爬取数据呢?某网站数据显示如下 ...
- Python爬虫——简单爬取(从网站上爬取一本小说)
从笔下文学网站爬取一本名为<剑来>的小说,作者为烽火戏诸侯 网站网址如下:https://www.bxwxorg.com/ ①通过查看网页源码找规律(在此之前请弄清楚网站允许爬取的部分,就 ...
- python外国网站爬虫_Python爬取某境外网站漫画,心血来潮,爬之
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 转载地址 https://blog.csdn.net/fei347795790? ...
- 用python写爬虫,爬取清纯妹子网站
转载:https://zhuanlan.zhihu.com/p/26395979 # encoding: utf-8 import requests from lxml import htmldef ...
最新文章
- 面试题:mysql 数据类型
- 新手向:从不同的角度来详细分析Redis
- Nginx教程系列一:Nginx简介(反向代理、负载均衡)
- 软考网络规划设计师备考及通过心得
- Linux下的虚拟机安装
- 顶点计划 顾家与工作问题讨论
- 数据库出现'\xF0\x9F\x98\xB8'
- 五周第三次课(4月20日)shell介绍、命令历史、命令补全和别名、通配符 、输入输出重定向...
- 基于GIS技术的智慧城市数字底盘(时空大数据平台)
- 斐讯音箱控制扫地机器人_【斐讯 R1 智能音箱使用体验】操作|功能|音质|识别_摘要频道_什么值得买...
- 优化器 示意图 神经网络_走入五彩斑斓神经网络世界:关于梯度下降、RMSprop优化器的研究...
- c5 LR is at 对于空指针的定位
- 【最新损失函数SIOU全文翻译】超越YOLO-V5等先进模型提高了+3.6%
- 深度搜索(DFS)和广度搜索(BFS)
- 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则
- ios图锁HQ应用项目源码
- sublime显示当前文件的编码格式
- 006_HTML布局任务与答案第一期(四川师范大学JavaWeb)
- 用原生JavaScript写出类似jQuery中slideUp和slideDown效果
- html5对话框背景透明度,纯CSS3背景透明的Speech Bubbles对话气泡