京公网安备 11010802034615号
经营许可证编号:京B2-20210330
大数据时代,这项收集数据的技能不可少
大数据是未来的“新石油”。《人类简史:从动物到上帝》的作者尤瓦尔·赫拉利说:大数据将是人类自由意志的终结,数据主义将取代以往的宗教和人文主义,成为未来的信仰。人人都在谈大数据,谈DT时代,我们剥去社会附加上的外衣,则回归“数据”二字。
那如何获取数据呢?
在运营公众号这么长一段时间,经常有人问超模君:超模君,我需要什么的数据,该怎么处理,或者直接问超模君,能不能给我提供一些数据?
其实超模君内心是奔溃的。。。而一般我给出的建议如果没有整理好的数据,可以尝试做个爬虫试试。而在获取数据的道路上并不简单,爬虫可谓是“麻雀虽小,五脏俱全”,爬虫虽然操作起来很简单,用十几行脚本语言就可以搞定,但其中可涉及到网络通信,字符串处理,数据库等,能使用到一种语言的几乎所有组件。
一言不合就上代码
我们先来看一个最简单的最简单的爬虫,用python写成,只需要三行。
import requests
url="http://www.cricode.com"
r=requests.get(url)
上面这三行爬虫程序,就如下面这三行情诗一般,很干脆利落。
是好男人,
就应该在和女友吵架时,
抱着必输的心态。
上面那个最简单的爬虫,不是一个完整的爬虫,因为爬虫通常需要以下3个步骤:
1)给定的种子URLs,爬虫程序将所有种子URL页面爬取下来
2)爬虫程序解析爬取到的URL页面中的链接,将这些链接放入待爬取URL集合里
3)重复1、2步,直到达到指定条件才终止爬取
因此,一个完整的爬虫大概是这样子的:
import requests #用来爬取网页
from bs4 import BeautifulSoup #用来解析网页
seds = ["http://www.hao123.com", #我们的种子
"http://www.csdn.net",
"http://www.cricode.com"]
sum = 0 #我们设定终止条件为:爬取到100000个页面时,就不玩了
while sum < 10000 :
if sum < len(seds):
r = requests.get(seds[sum])
sum = sum + 1
do_save_action(r)
soup = BeautifulSoup(r.content)
urls = soup.find_all("href",.....) //解析网页
for url in urls:
seds.append(url)
else:
break
上面那个完整的爬虫,不足20行代码,相信你能找出20个需要改进的地方来。因为它的缺点实在是太多了。下面列举一下它的N个缺点:
1)我们的任务是爬取1万个网页,按上面这个程序,一个人在默默的爬取,假设爬起一个网页3秒钟,那么,爬一万个网页就要3万秒钟。MGD,我们可以考虑开启多个线程去一起爬取,或者用分布式架构去并发地爬取网页。
2)种子URL和后续解析到的URL都放在一个列表里,我们应该将这些待爬取的URL存放到一个新的更合理的数据结构里,例如队列或者优先队列。
3)对各个网站的URL,我们一视同仁,然而,我们应该是要区别对待的。应当考虑大站好站优先原则。
4)我们每次发起请求,都是根据URL来发起的,而在这个过程中会牵涉到DNS解析(将URL转换成 IP 地址)。一个网站通常有数以万计的URL,所以我们可以考虑将这些网站域名的 IP 地址进行缓存,避免每次都发起DNS请求,浪费时间。
5)解析到网页中的URLs后,我们没有做任何去重处理,全部放入了待爬取的列表中。事实上,可能有很多链接是重复的,我们做了很多无用功。
6)…..
那么,真正的问题来了,学挖掘机到底哪家强?
现在我们就来列出上面找出的几个问题的解决方案。
1)如何做到并行爬取
我们可以有多重方法去实现并行。
多线程或者线程池方式,一个爬虫程序内部开启多个线程。同一台机器开启多个爬虫程序,这样,我们就有N多爬取线程在同时工作。能大大缩短时间。
此外,当我们要爬取的任务特别多时,一台机器、一个网点明显不够,这时我们就要考虑分布式爬虫了。常见的分布式架构有:主从(Master——Slave)架构、点对点(Peer to Peer)架构,混合架构等。
说到分布式架构,我们需要考虑的问题就有很多,比如我们需要分派任务,各个爬虫之间需要通信合作,共同完成任务,不要重复爬取相同的网页。分派任务时我们要做到公平公正,就需要考虑如何进行负载均衡。负载均衡,我们第一个想到的就是Hash,比如根据网站域名进行hash。
负载均衡分派完任务之后,并不意味着万事大吉了,万一哪台机器崩溃了呢?原先指派给崩溃的那台机器的任务应该再指派给哪台机器?又或者哪天要增加几台机器,任务重新分配问题该如何解决?
用一致性Hash算法就是一个比较好的解决方案。
2)如何对待待抓取队列
类似于操作系统如何调度进程的场景。
不同的网站,重要程度不同,因此,可以设计一个优先级队列来存放待爬取的网页链接。这样一来,每次抓取时,重要的网页都会被我们优先爬取。
另外,你也可以效仿操作系统的进程调度策略之多级反馈队列调度算法。
3)进行DNS缓存
为了避免每次都发起DNS查询,我们可以将DNS进行缓存。DNS缓存当然是设计一个hash表来存储已有的域名及其 IP 。
4)进行网页去重
说到网页去重,应该都会想到垃圾邮件过滤。垃圾邮件过滤的一个经典的解决方案是Bloom Filter(布隆过滤器)。布隆过滤器原理简单来说就是:建立一个大的位数组,然后用多个Hash函数对同一个url进行hash得到多个数字,然后将位数组中这些数字对应的位置为1。下次再来一个url时,同样是用多个Hash函数进行hash,得到多个数字,我们只需要判断位数组中这些数字对应的为是全为1,如果全为1,那么说明这个url已经出现过。如此,便完成了url去重的问题。不过,这种方法会有误差,但是只要误差在我们的接受范围之内,就像是1万个网页,我们只爬取到了9999个,剩下那1个网页,谁在乎呢!
5)数据存储的问题
数据存储同样是一个很有技术含量的问题。用关系数据库存取还是用NoSQL,或者是自己设计特定的文件格式进行存储,都有很大工程可做。
6)如何完成进程间通信
分布式爬虫,离不开进程间的通信。我们可以以规定的数据格式进行数据交互,去完成进程间的通信。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在企业数字化运营、业务流程管理与精细化管控体系中,流程运营是串联各项业务环节、保障工作落地、提升运转效率的核心载体。无论 ...
2026-09-16在数据分析与统计学研究中,卡方检验是分析分类变量关联性与差异性的重要方法,广泛应用于市场调研、行为统计、社会调查、商业数 ...
2026-09-16 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“什么是指标”“指标和维度有什么区别”“如何定义指标值的计算规则和 ...
2026-09-16CDA数据分析师 出品 作者:李诗怡 定义: 用户增长核心分析框架,刻画用户从接触产品到自发推荐的全生命周期,五个递进环节构建 ...
2026-09-15在数字化营销与精细化用户运营时代,企业传统的广撒网式营销模式成本高、转化率低,已无法适配精准商业竞争需求。客户画像作为大 ...
2026-09-15 很多数据分析师精通描述性统计,能熟练计算均值、中位数、标准差,但当被问到“用500个样本如何推断10万用户的真实满意度” ...
2026-09-15在MySQL数据库数据查询与数据分析中,GROUP BY与ORDER BY是使用频率极高的核心关键字。二者语法结构相似,常搭配使用,但核心功 ...
2026-09-14随着数字化治理、智慧运营、数字孪生技术的普及,数字体征成为衡量业务状态、系统运行、城市治理与企业经营健康度的核心体系。数 ...
2026-09-14 很多数据分析师沉迷于复杂的模型和算法,却忽略了数据分析的一项基础能力——描述性统计。事实上,大量商业分析问题,用描述 ...
2026-09-14在MySQL数据库运维与开发实践中,经常出现一种典型现象:数据库实际存储的数据量很小,数据表条数少、文件体积低,但服务器整体 ...
2026-09-11 很多数据分析师能熟练计算均值、标准差,但当被问到“总体和样本有什么区别”“参数和统计量有什么关系”“数据级别的高低如 ...
2026-09-11CDA数据分析师 出品 作者:李诗怡 定义: 将同一时间段内因具备相同属性或共同经历的用户划分为群体,分析其留存与生命周期价值 ...
2026-09-11在零售、商超、餐饮、线下门店等实体商业运营中,客流与销售额是衡量门店经营状态的两大核心指标。销售额是门店经营的最终结果, ...
2026-09-10在数据可视化体系中,柱形图是最基础、应用最广泛的图表类型,其中**累计柱形图(堆积柱状图)**是兼顾整体总量与内部结构的核心 ...
2026-09-10 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-09-10在Python Pandas数据分析中,DataFrame是承载结构化数据的核心载体,数据清洗、数据修正、条件赋值、字段更新等实操场景,都离不 ...
2026-09-09 很多数据分析师掌握了Excel函数、会写SQL查询,但当被问到“数据从哪里来”“数据加工有哪些步骤”“如何使用分析工具连接数 ...
2026-09-09卡方检验(Chi-Square Test)是统计学中针对分类数据的经典显著性检验方法,核心用于判断两个离散分类变量是否相互独立、数据实 ...
2026-09-09CDA数据分析师 出品 作者:李诗怡 1. 销售漏斗阶段判断 题目:销售漏斗模型中,通过广告、社交媒体等方式触达品牌信息(如浏览品 ...
2026-09-07在Python数据分析中,Pandas库的DataFrame是最核心、最常用的结构化数据表对象,类似于Excel的二维表格,具备规整的行列结构、字 ...
2026-09-07