大数据时代,这项收集数据的技能不可少
大数据是未来的“新石油”。《人类简史:从动物到上帝》的作者尤瓦尔·赫拉利说:大数据将是人类自由意志的终结,数据主义将取代以往的宗教和人文主义,成为未来的信仰。人人都在谈大数据,谈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)如何完成进程间通信
分布式爬虫,离不开进程间的通信。我们可以以规定的数据格式进行数据交互,去完成进程间的通信。
7)……
废话说了那么多,真正的问题来了,问题不是学挖掘机到底哪家强?而是如何实现上面这些东西!:)
数据分析咨询请扫描二维码
CDA持证人Louis CDA持证人基本情况 我大学是在一个二线城市的一所普通二本院校读的,专业是旅游管理,非计算机非统计学。毕业之 ...
2024-12-18最近,知乎上有个很火的话题:“一个人为何会陷入社会底层”? 有人说,这个世界上只有一个分水岭,就是“羊水”;还有人说,一 ...
2024-12-18在这个数据驱动的时代,数据分析师的技能需求快速增长。掌握适当的编程语言不仅能增强分析能力,还能帮助分析师从海量数据中提取 ...
2024-12-17在当今信息爆炸的时代,数据分析已经成为许多行业中不可或缺的一部分。想要在这个领域脱颖而出,除了热情和毅力外,你还需要掌握 ...
2024-12-17数据分析,是一项通过科学方法处理数据以获取洞察并支持决策的艺术。无论是在商业环境中提升业绩,还是在科研领域推动创新,数据 ...
2024-12-17在数据分析领域,图表是我们表达数据故事的重要工具。它们不仅让数据变得更加直观,也帮助我们更好地理解数据中的趋势和模式。相 ...
2024-12-16在当今社会,我们身处着一个飞速发展、变化迅猛的时代。不同行业在科技进步、市场需求和政策支持的推动下蓬勃发展,呈现出令人瞩 ...
2024-12-16在现代商业世界中,数据分析师扮演着至关重要的角色。他们通过解析海量数据,为企业战略决策提供有力支持。要有效完成这项任务, ...
2024-12-16在当今数据爆炸的时代,数据分析师是组织中不可或缺的导航者。他们通过从大量数据中提取可操作的洞察力,帮助企业在竞争激烈的市 ...
2024-12-16在现代企业中,数据分析师扮演着至关重要的角色。他们不仅负责处理和分析大量的数据,还需要将这些分析结果转化为切实可行的商业 ...
2024-12-16在当今的大数据时代,数据分析已经成为推动企业战略的重要组成部分。无论是金融、医疗、零售,还是制造业,各个行业对数据分析的 ...
2024-12-16在当今这个以数据为驱动力的时代,数据分析领域正在迅速扩展与发展。随着大数据、人工智能和机器学习技术的不断进步,数据分析已 ...
2024-12-16在信息爆炸和数据驱动的时代,数据分析专业是否值得一选成为许多人思考的议题。无论是刚刚迈入大学校门的新生,还是考虑职业转型 ...
2024-12-16适合数据分析专业学生的实习岗位有很多,以下是一些推荐: 阿里巴巴数据分析岗位实习:适合经济、统计学、数学及计算机专业的 ...
2024-12-16在数据科学领域,探索实习机会是一个理想的学习和成长方式。实习不仅可以提供宝贵的实践经验,还能帮助学生发展关键的数据分析技 ...
2024-12-16在当今信息驱动的时代,数据分析不仅成为了企业决策的重要一环,还催生了各种职业机会。从技术到业务,数据分析专业的就业岗位种 ...
2024-12-16在现代企业中,数据分析师被誉为“数据探险家”,他们通过揭示隐藏在数据背后的故事,帮助公司优化业务策略和做出明智的决策。然 ...
2024-12-16在大数据崛起的时代,数据分析师被誉为企业的“幕后英雄”。他们通过解读数据,揭示隐藏的真相,为企业战略提供重要的指导。这份 ...
2024-12-16在这个信息大爆炸的时代,数据分析师成为了企业中的“福尔摩斯”,他们能够从庞杂的数据中提取关键洞察,为业务发展提供坚实支持 ...
2024-12-16在这个数据为王的现代社会,数据分析师如同企业的导航员,洞悉数据背后所隐藏的商业机会和战略优势。然而,成为一名优秀的数据分 ...
2024-12-16