超简单的shell爬虫示例

首先,我并不太会爬虫,shell编程也是一知半解,这次纯粹是需求驱动。

因此,在下方的实现方法并不一定是最优解,甚至是比较笨的解决方法,但是仍然决定记录下来。

需求

我的一部分博客偶尔也发在csdn上面,然后由于自己的”小心思”,我老是想知道自己在csdn的排名及浏览量是多少,每次登陆去查看显得太烦了,因此写了个shell脚本,每天自动抓取自己账号的浏览量及排名存进mysql中。

这样就可以直接在服务器上的mysql中查看排名,以方便后续扩展,无论是写个接口方便自己查看,还是用图标展示,都方便许多。

实现

1.在mysql中创建数据库

1
2
3
4
5
6
7
8
9
CREATE TABLE `csdn` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`rank` int(20) NOT NULL DEFAULT '1' COMMENT '排名',
`view` int(20) NOT NULL DEFAULT '1' COMMENT '浏览量',
`date` varchar(128) NOT NULL DEFAULT 'wrong' COMMENT '日期',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_at` timestamp NOT NULL DEFAULT '2018-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8

2.编写shell脚本

1
2
3
4
5
6
7
8
9
10
#获取排名
rank=`curl https://me.csdn.net/qq_24629159 | grep -B1 "排名" | grep -o "[0-9]*[1-9][0-9]*"`
#获取浏览量
view=`curl https://me.csdn.net/qq_24629159 | grep -B1 "访问" | grep -o "[0-9]*[1-9][0-9]*"`
#日期
date=`date +%Y%m%d`
#打印日志
echo "${date}的排名为${rank},浏览量为${view}"
#插入到数据库
mysql -u root -p******* -D mydb -e "insert into csdn(rank,view,date) values ("$rank", "$view","${date}")"

在获取csdn上的数据时,使用了简单粗暴的grep,原理是先获取我个人页面的所有源码,然后根据源码发现,排名数字在排名字符串上一行,因此搜索得到上一行,之后再拿到的一行里面匹配整数。

csdn个人页面的源码如下:

3.设置定时执行

定时执行我们使用unix系统自带的corntab。

执行corntab -e,打开编辑页面,之后在文件中添加一行30 3 * * * /bin/bash /usr/huyan/csdn_rank.sh >> /usr/huyan/csdn_rank.log,这代表着在每天的凌晨三点半执行该脚本并将日志输出到后面的文件中。

之后重启crontab以使我们的任务生效service cron restart.

好了,到了这里就完成啦,以后就可以再数据库中直接看到以往的排名信息及浏览量了。


完。



ChangeLog

2018-11-16 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十