No.1 聊一聊数据获取和爬虫

1,171 阅读6分钟
原文链接: mp.weixin.qq.com

0x00 前言

为什么要把数据获取、爬虫放在一起来聊呢?

居士是想成为一名数据科学家的!数据科学家就要具备很多的技能,什么统计学、数据挖掘、数据仓库、大数据计算、数据可视化等等。

但是,首先我们要有数据,没有数据我们玩什么?想要玩数据,我们就要来聊一下数据获取,数据获取有很多途径,爬虫算是其中最自力更生的技能了,而实现爬虫又和图论的知识有很深的联系,因此在聊得时候还要顺便聊一下图论。

0x01 数据获取

我们站在个人的角度看一下数据获取,我们会有几个比较简单的数据获取途径:

  1. 公司提供的数据

  2. 网上下载的免费数据集

  3. 买数据

  4. 爬虫

公司提供的数据 应该是数据从业者接触最多的数据了,它的收集和处理我们后续专门来聊。 只是自己在做测试和写博客的时候有时候是不方便直接使用公司数据的,因此这里暂时不提。

免费数据集在网上有很多,现在居士的网盘中还有几百T的公开免费数据集。这部分数据的价值是很大的,只是在需要的时候能找到相应的数据可能会不太容易。

买数据就没什么好说了,一般站在个人角度,我们是不会考虑花钱的事情的。

我们主要来聊网络爬虫。爬虫是获取数据灵活度极高的一种方式,我们基本上可以爬取网上所有我们能看到的网页(当然,很多网页难度很大),按照我们想要的格式爬取我们需要的数据。

最重要的一点,自己爬的数据,自己最了解!也容易有成就感。

0x02 爬虫

首先要十分明确一点:爬虫很简单。

我们本篇会先讲一些爬虫的基本原理,聊一下爬虫的几个要点,然后具体的实现会放在下一篇文章中。

一个最基本的爬取网页的爬虫只要五六行程序就能搞定,一个完善一点包括广度优先遍历、页面解析和已访问网页记录的爬虫也不过百行就能搞定。因此不需要对爬虫有过多的畏惧感。

当然,爬虫的水还是很深的,我们要考虑爬虫的分布式化、防爬虫等等一系列问题,但是,刚开始可以先不管那么多,我们毕竟不是爬虫工程师,等遇到这些问题再解决即可。

爬虫是什么

爬虫是什么?这个问题问的好!我们可以将问题稍微具体化一点:网络爬虫是什么?

我们不搬概念,大致解释一下居士的理解:

爬虫是一段代码,它用于将互联网上的网页爬取下来。爬虫会根据一定的规则,通过一个网页找到更多的网页,这样一个个网页爬过去,把它们的内容存在本地。

爬虫的要点

我们开始聊一聊爬虫的设计和实现。爬虫有几个设计要点:遍历算法的选择、页面内容的解析和维护已访问URL的列表,请看下面的思维导图。

遍历算法的选择

图的遍历在爬虫中的应用在此处就会有体现,我们在实现爬虫是应该选广度优先遍历(BFS)还是深度优先遍历(DFS)?

从理论上讲,两个算法都能在大致相同的时间爬下指定范围的内容。

但是我们在真正选择的时候会更倾向于用广度有限遍历,为什么? 大部分网站的最主要内容应该是主页,其次是主页中展示的网页,毕竟在规划网站时也会把最重要的内容最先展示给用户。因此我们会优先使用BFS。

但是,真正在做工程的时候,还是要考虑DFS的,这和具体的实现场景有很大的关系,在这里我们可以先简单地认为BFS更适合爬虫。

页面解析

页面解析主要分两个部分:内容的解析和URL的解析。

内容的解析就是从html中提取我们想要的内容,比如标题、正文。居士没有接触过百度、Google这种公司专门做网络爬虫的大团队,不太清楚他们怎么做的。

但是,这一块会很繁琐,每个网站的页面标签设计都不一样,大部分自己写的爬虫都需要来自己总结规则并实现。在Python中我们可以用BeautifulSoup来解析相应的内容,十分简单,具体方法看后续的文章。

URL的解析和内容类似,不同的是,很多网站页面中的URL并不完整,比如简书的,它不会把完整的URL写进去,这就需要自己来拼接。

已访问URL列表

已访问URL列表的维护是十分挺重要的,如果不记录已访问页面列表,会造成相当多的重复计算。

为了防止一个网页被下载多次,我们可以用一个散列表记录哪些网页已经下载过。再遇到时就可以跳过。

散列表的功能主要是两个:1.判断该URL是否在表中,2.加入新的URL。 基本的实现十分简单,但是当有千台服务器一起访问这张散列表事就会有很大的性能瓶颈。 关于这个问题可以看《数学之美》

0xFF 总结

本文整体是在闲聊,先聊了一些数据获取的东东,然后分享了一些爬虫的大致设计思路,这里没有技术细节。

在下一篇文章中居士会用 Python 一步步实现一个相对完整的爬虫程序,用来爬取百万简书好友的关系对。

再接着可玩的东西就很多的,我们可以在这些关系数据的基础上跑很多有意思的算法,比如 PageRank 和 LPA ,也可以继续爬更多的数据来做分析和挖掘,比如爬博客的正文。

总之,你会发现,当你拿到数据之后,就可以做更多有意义的事情。