聊一聊数据获取和爬虫

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 ,也可以继续爬更多的数据来做分析和挖掘,比如爬博客的正文。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云时之间

简单爬虫(一):实现百度音乐下载

现在我们听歌往往会集中在一个平台,但是往往很多歌曲只在一个平台独占,我们听自己几首想听的歌曲往往要在几个平台跳来跳去,正好现在在使用爬虫,在学着解析网页的时候,...

39313
来自专栏java一日一条

13个不容错过的Java项目

GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自有代码或者学习编程技能。无论如何,开发工作当中我们几乎不可能绕得开GitHub...

5461
来自专栏web前端教室

【先行者】把光标停在input的右侧结尾处?

今天咱们先行者计划的微信群里有个同学提了这个问题, ? 我当时也没怎么细想,就给了个思路, ? 后来这个同学说, ? <!-- --> setSelect...

1896
来自专栏陈树义

【超实用】面对枯燥的源码,如何才能坚持看下去?

一个软件开发人员,工作到了一定的年限(一般是3、4年左右),如果他还没学会阅读源码,那么他就会遇到瓶颈。因为到了这个时候的开发,他应该不仅仅只会做那些 CURD...

1575
来自专栏我思故我在

ABP框架 - N层架构

1463
来自专栏吉浦迅科技

对于CUDA Fortran开发者来说,函数传参真这么麻烦么?

有天,有人在论坛上问了一个问题: 我想创建一个data区域来减少subroutine之间的数据传递(阅读原文查看楼主的代码),这样就不必在subroutine之...

3516
来自专栏编程

Python学习(一):概述

第1 章 概述 Table of Contents 应用范围 优缺点 安装 运行第一个程序 参考 工欲利其器 必先知其器 应用范围 Python是著名的“龟叔”...

18610
来自专栏申龙斌的程序人生

零基础学编程027:站在巨人的肩膀上

在《零基础学编程021:获取股票实时行情数据》这一节里,我们利用urllib抓取新浪财经中的股票数据,可以取出谷歌股票的开盘价,回顾一下代码: import u...

3496
来自专栏JavaEdge

设计模式实战 - 中介者模式

以终端销售商(以服务最终客户为目标的企业,如超市)为例,采购部门要采购IBM的电脑,它根据以下两个要素来决定采购数量。

1194
来自专栏阮一峰的网络日志

为什么寄存器比内存快?

计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。 ? 同样都是晶体管存储设备,为什么寄存器比内...

3487

扫码关注云+社区

领取腾讯云代金券