大数据时代,这项收集数据的技能不可少
大数据是未来的“新石油”。《人类简史:从动物到上帝》的作者尤瓦尔·赫拉利说:大数据将是人类自由意志的终结,数据主义将取代以往的宗教和人文主义,成为未来的信仰。人人都在谈大数据,谈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)……
废话说了那么多,真正的问题来了,问题不是学挖掘机到底哪家强?而是如何实现上面这些东西!:)
数据分析咨询请扫描二维码
在当今以数据为导向的商业环境中,数据分析师的角色变得越来越重要。无论是揭示消费者行为的趋势,还是优化企业运营的效率,数据 ...
2024-11-17在当今以数据为导向的商业环境中,数据分析师的角色变得越来越重要。无论是揭示消费者行为的趋势,还是优化企业运营的效率,数据 ...
2024-11-17金融数学是一门充满挑战和机遇的专业,它将数学、统计学和金融学的知识有机结合,旨在培养能够运用数学和统计方法解决复杂金融市 ...
2024-11-16在信息时代的浪潮中,大数据已成为推动创新的重要力量。无论是在商业、医疗、金融,还是在日常生活中,大数据扮演的角色都愈发举 ...
2024-11-16随着大数据技术的迅猛发展,数据已经成为现代商业、科技乃至生活各个方面的重要资产。大数据专业的毕业生在这一变革背景下,拥有 ...
2024-11-15随着大数据技术的迅猛发展,数据已经成为现代商业、科技乃至生活各个方面的重要资产。大数据专业的毕业生在这一变革背景下,拥有 ...
2024-11-15在快速演变的数字时代,数据分析已成为多个行业的核心驱动力。无论你是刚刚踏入数据分析领域,还是寻求进一步发展的专业人士,理 ...
2024-11-15Python作为一种通用编程语言,以其简单易学、功能强大等特点,成为众多领域的核心技术驱动者。无论是初学者还是有经验的编程人员 ...
2024-11-15在当今数据驱动的世界中,数据分析已成为许多行业的基础。无论是商业决策,产品开发,还是市场策略优化,数据分析都扮演着至关重 ...
2024-11-15数据分析作为现代商业和研究领域不可或缺的一部分,吸引了越来越多的初学者。然而,自学数据分析的过程中,初学者常常会遇到许多 ...
2024-11-15在当今的数据驱动世界中,机器学习方法在数据挖掘与分析中扮演着核心角色。这些方法通过从数据中学习模式和规律来构建模型,实现 ...
2024-11-15随着数据在各个行业的重要性日益增加,数据分析师在商业和技术领域的角色变得至关重要。其核心职责之一便是通过数据可视化,将复 ...
2024-11-15数据分析师的职责不仅仅局限于解析数据和得出结论,更在于将这些复杂的信息转换为清晰、易懂且具有影响力的沟通。良好的沟通能力 ...
2024-11-15数字化转型是企业提升竞争力和实现可持续发展的关键路径。面对快速变化的市场环境,以及技术的飞速发展,企业在数字化转型过程中 ...
2024-11-15CDA数据分析师认证:CDA认证分为三个等级:Level Ⅰ、Level Ⅱ和Level Ⅲ,每个等级的报考条件如下: Le ...
2024-11-14自学数据分析可能是一条充满挑战却又令人兴奋的道路。随着数据在现代社会中的重要性日益增长,掌握数据分析技能不仅能提升你的就 ...
2024-11-14数据分析相关职业选择 数据分析领域正在蓬勃发展,为各种专业背景的人才提供了丰富的职业机会。从初学者到有经验的专家,每个人 ...
2024-11-14数据挖掘与分析在金融行业的使用 在当今快速发展的金融行业中,数据挖掘与分析的应用愈发重要,成为驱动行业变革和提升竞争力的 ...
2024-11-14学习数据挖掘需要掌握哪些技能 数据挖掘是一个不断发展的领域,它结合了统计学、计算机科学和领域专业知识,旨在从数据中提取有 ...
2024-11-14统计学作为一门基于数据的学科,其广泛的应用领域和多样的职业选择,使得毕业生拥有丰厚的就业前景。无论是在政府还是企业,统计 ...
2024-11-14