想实现全网数据的清洗与聚合?从爬虫做起

实现资源聚合的必要性

试着去搜索网络上数据有多少,但是没有明确的结果。但是我们可以明确感受到由于互联网的快速发展,每天新产生的内容也越来越多,这其中我们真正需要的,也就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,并展示测试成果,详细的指导请求助于教程类网站。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180809A0207P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券