网站首页 文章专栏 想实现全网数据的清洗与聚合?从爬虫做起
试着去搜索网络上数据有多少,但是没有明确的结果。但是我们可以明确感受到由于互联网的快速发展,每天新产生的内容也越来越多,这其中我们真正需要的,也就1%或者更少。其余的时间,我们都暴露在各类媒体的“推荐”或者“智能算法”之下。
那么如何把属于自己的时间夺回来,又不会“两耳不听窗外事,一心只读圣贤书”呢?一个技术上可实现的路径就是实现数据的清洗与聚合。或许表达不够准确,但目的是相似的——去掉目标事件的重复内容,将剩下的内容按需呈现。
在过去,我们如果被“如何解决win10的自动更新”困扰,不同的搜索引擎会给出很多结果。
但是我们都明白,能够适配你电脑的解决方案只有那么一两个。所以你要一个答案一个答案地试,一直到解决问题为止。
那如果你碰到是更复杂的问题呢?我希望有这么一个聚合平台充当“人肉搜索引擎”,她在看遍了所有内容后,确定我的环境,随后直接给出一个答案,而且这个答案还是正确的。进而,与当前的AI助手结合,提供每日简报,以及决策支持。
目前碰到的技术问题大多都是在博客上得到解决的,所以数据也要从博客爬起,我选择的第一个博客平台是CSDN。
首先梳理下爬虫的逻辑。很简单,第一个爬虫不需要太高深的知识。我们就是模拟一个浏览器的数据请求,把网页下载下来;构建一个正则表达式,把有用的文字抽取出来;打开一个文件,把文字写进去。
CSDN的页面是有规律的。
首先,知道作者ID就可以构造出文章列表,结构为prefix + id + /article/list/ + list_number. 注意文章列表的下一页标签是js动态生成的,可以顺序增加list_number, 直到返回404错误,表明文章列表结束,避开执行js。
其次,关键词、文章ID、文章内容使用的html标签都一致,便于爬取。
请求一个网页数据是很简单的。我们这是使用的是socket和urlib两个模块,注意先import 进来,并且urllib直接导入request类,即import urllib.request as request.
设置header之后传入Request,随后使用urlopen方法打开一个网络链接,之后再调用read方法读取页面内容。当然,这里有些异常处理流程,只是做了错误原因输出,并没有实现从故障中恢复。
正则表达式是最基础也最强大的工具。首先import re, 然后使用compile方法与findall方法。
这里的正则表达式使用.去匹配任意除换行符之外的任意字符;用(.)去返回我们想要的数据。
在使用类似方法得到文章id、关键词、是否原创、标题之后,把正文部分作为单独文件写入到磁盘,把文章的属性信息与对应的磁盘文件名写入到config.json文件。每一个作者id对应一个config.json文件,方便后期自动化处理。
本次爬取测试后共抓取1W博文 ,后期的深入方向是内容去重,优化方向是自动化爬虫(如自动获取用户ID、异常自动修复实现7x24h运行、云端部署、爬取图片)。
注:本文只是分享idea,并展示测试成果,详细的指导请求助于教程类网站。