从零开始的爬虫项目(三)

本次也是最后一次的任务是用MySQL查询已爬取的数据,并实现用网页发送请求到后端查询的功能。

在此之前

在成功爬取新浪新闻后,我需要再爬取几个网站来丰富我的数据库。高中时算是一个小球迷,我本想爬取一些足球资讯网站,如懂球帝,奈何发现它的html文件过于恶心,毫无格式,文章作者与发布日期都能放在一个类值为“tips”的标签里:
在这里插入图片描述
我不得不放弃,现实地开始爬取一些格式化较强的网站,如中国证券网、财经网以及人民日报网。在爬的过程中我也遇到了一些问题:

  • 编辑者格式不统一
    我发现在个别新闻中编辑者的名字后会带有编号:

在这里插入图片描述
我一开始的想法是判断是否存在字母数字字符,若有则舍弃该部分并保留其余字符:

var not_chinesereg = /\w+/ ;        
if(not_chinesereg.exec(fetch.author) == null);        
else{            
	var uselesscode = not_chinesereg.exec(fetch.author)[0];
	fetch.author = fetch.author.replace(uselesscode,'');}

虽然效果是出来了,但总觉得不太范用 -_-||

在这里插入图片描述
于是我百度了一下一个汉字的正则表达式形式: /[\u4E00-\u9FA5]/
并做了些调整:

var extrareg = /[\u4E00-\u9FA5]+.[\u4E00-\u9FA5]*/;        
fetch.author = extrareg.exec(fetch.author)[0];

这样就能得到形如 “责任编辑:张三” 或置空的 “责任编辑:” 的字符串,却没想到财经网还有"编辑:张[space]三"的操作,那只能是特事特办了 :/[\u4E00-\u9FA5]+.[\u4E00-\u9FA5]+(.[\u4E00-\u9FA5]+){0,1}/

同时,由于某些网站源代码中特定关键词置空的可能性,所有用到replace.()方法等的必须是非undefined或null属性,不得不先行判断是否为空,若空则return进入下一个。

用MySQL查询已爬取的数据

十分简单,举例:若在 database 里创建的 table 中有先行定义好的 title, url , author等属性,希望查询关键词"XXX", 则可通过如下命令:

select url , title , author from _table_name where title like '%XXX%';
//也可以
select title from _table_name where title like '%XXX%' 
or content like'%XXX%';   
实现用网页发送请求到后端查询

//哈哈这段着实搞不懂,只好大篇幅码老师的代码了
需要用express脚手架来创建一个网站框架,首先需要安装一下express

npm若不指定版本,默认加载的是最新版本,已经是4.x.x的版本了,而最新express4.0+版本中将命令工具分离了出来,所以要安装express-generator。

不知道为什么我的电脑仅在当前文件夹下安装,依旧会报错 " ‘express’ 不是内部或外部命令,也不是可运行的程序或批处理文件" , 因此在npm时需要-g一下。
安装好后输入: express -e search_site ,便会在当前路径生成一个名为"search_site"的文件夹。由于需要使用mysql,因此要将之前写的mysql连接池文件拷贝进该文件夹并在cmd内运行: npm install mysql --save (–save表示将mysql包安装到该项目中,并且将依赖项保存进package.json里)
接下来将 “cookie-parser” , “debug” , “ejs” , “express” , “http-errors” , “morgan” 上述依赖项通过npm install全部安装,完成网站搭建。
用vscode打开文件夹search_site,打开子文件夹routes内的index.js文件进行修改:

var express = require('express');var router = express.Router();
var mysql = require('../mysql.js');
/* GET home page. */
router.get('/', function(req, res, next) {    res.render('index', { title: 'Express' });});
router.get('/process_get', function(request, response) {   
	var fetchSql = "select url,title,author,source_name,publish_date" 
	+ "from fetches where title like '%" + request.query.title 
	+ "%' or content like '%" + request.query.title + "%'";
	mysql.query(fetchSql, function(err, result, fields) {        		
		response.writeHead(200, {
		"Content-Type": "application/json"        });        
		response.write(JSON.stringify(result));        
		response.end();    
	});
});
module.exports = router;

这样就可以通过网页端向后端发送mysql查询语句,查找标题或内容中含有关键字的相关新闻,并将信息转换为JSON字符串通过 response.write() 写到网页界面上。

接下来需要写一个html文件来定义一下网页页面的布局,在其中构建个表:

<!DOCTYPE html>
<html>
<header>    
	<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</header>
<body>   
	<form>        
		<br> 查找标题或内容:<input type="text" name="title_text">       
		<input class="form-submit" type="button" value="查询">    
	</form>    
	<div class="cardLayout" style="margin: 10px 0px">        
		<table width="100%" id="record2" border = "2" style="background-color: grey;"></table>    
	</div>    
	<script>        
		$(document).ready(function() {              
		$("input:button").click(function() {                
		$.get('/process_get?title=' + $("input:text").val(), function(data) {                    
			$("#record2").empty();                    
			$("#record2").append('<tr class="cardLayout"><td>url</td><td>title</td>'+                       
			'<td>author</td><td>source_name</td><td>publish_date</td></tr>');                    
			for (let list of data) {                        
			let table = '<tr class="cardLayout"><td>';                        
			Object.values(list).forEach(element => {
				table += (element + '</td><td>');                        
				});                        
			$("#record2").append(table + '</td></tr>');
			}                
		});            
		});
		});    
	</script>
</body>
</html>

其中表的第一行按之前index.js中向mysql询问的语句中各属性的先后顺序进行排序。我也不是很懂其中每一步的意思,本想再添加一个空文本框对别的特定元素就行查找,无奈水平有限,就干脆在向mysql询问的询问语句中添加 or 来实现多对象的搜索,顺带给表格添加了一个border元素,并将背景设为灰色(免得一个纯白底黑字看得亮得人眼疼),效果如下:
在这里插入图片描述
在这里插入图片描述

小结

本次的爬虫作业算是来到了尾声,只能说能力太有限功夫不到家,唯一能做的就是在老师讲过后针对个例进行一些细节处理。虽然文章写得短,但是每一段我也会去努力弄懂代码的含义,在百度等网站搜索一些相关的语法用法,只能说是在摸爬滚打中学着、试着去写一些属于自己的,还上不了档次的东西吧。

当然,心态要放正,编程对于我来说是一生的东西,而我现在才刚刚起步,想要做到如饮食呼吸般自在必然需要时间去沉淀,很感谢有这个机会能够去接触一些有趣的项目,并在老师的帮助下找到一些写东西的感觉,而非孤助无援最后灰心丧气。

写在最后,感觉时代还是变化的好快,过去一直都是纸质笔记的时代,一进到大学发现大家都有着用各类软件记电子笔记,或者在github上开设博客记录生活与心得的习惯,过去就没怎么碰过办公软件的我发现开设github blog真的好难o(╥﹏╥)o ,只能先开个CSDN,以简单的格式先行记录了(貌似连首行缩进都没有),有时间去问问室友们到底该怎么搭个博客引入个好的css框架…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值