阅读本篇大概需要 4 分钟。
很多人都或多或少听说过 Python 爬虫,我也一直很感兴趣,所以也花了一个下午入门了一下轻量级的爬虫。为啥是轻量级的爬虫呢,因为有的网页是比较复杂的,比如需要验证码、登录验证或者需要证书才能访问,我们了解爬虫的概念和架构,只需要做一些简单的爬取工作即可,比如爬取百度百科这种纯信息展示的网页,这些都是不需要登录的静态网页。即便再复杂的爬虫网页和爬虫框架,实际上都离不开这一套基本的爬虫架构。
爬虫是一段自动抓取互联网信息的程序。每个网页都有一个URL,从一个网页入口开始,通过各种URL的跳转形成一个相互指向的关系,最终可以形成一种网状结构,这就是互联网。理论上来说,一个庞大的网页项目,从入口开始,总能通过某种跳转路径到达项目系统中的任何一个网页,当我们人工的从网页上获取信息的时候,只能跟着步骤,一步一步的点击跳转,最终获取到我们希望得到的信息。
比如典型的,我昨天想领养一只猫咪,我先点开同城网站,然后找到宠物分类,再找到猫咪分类,再选择一些条目,比如是领养而不是购买,年龄在半岁以下,狸花猫等等这些特性,最后点击搜索,网页给了我具体的条目列表,我通过人工的方式,获取了我想要的信息。虽然定位精准,但不免很浪费人力时间。
而爬虫就是一个这样的自动程序,我们设定好我们需要的主题和目标,比如「猫咪」、「6个月」等标签,爬虫会从某个特定URL入手,自动的访问它所关联的URL,并且提取出我们需要的数据。可以说爬虫就是自动访问互联网,并且提取价值数据的程序。
爬虫的价值就在于此,可以获取将互联网上巨量的数据都为我所用,有了这些数据,我们就可以进行学习和分析,或者利用数据做出相关的产品。
爬取 GitHub 中一天浏览量和 star 提升数最高的项目,有了这个数据,就可以做出一个 GitHub 开源项目推荐的项目。
现在各大网站的歌曲都有版权保护,下载歌曲不太方便,可以通过歌曲名字,爬取网上所有免费下载链接,这样就可以轻易做出一个歌曲搜索下载的聚类工具。
可以说,只要有数据,没有做不到的,只有你想不到的,数据就在放在互联网上,通过爬虫我们可以让数据发挥更大的作用和价值,在大数据时代,爬虫毋庸置疑是一门一线技术。
我们先来看一下简单的爬虫架构图
首先我们需要一个爬虫调度端来启动和停止爬虫,同时也要通过它来监视爬虫的状态,并通过它提供接口来作具体的数据应用。这个部分不属于爬虫本身。
图中阴影方框中的部分就是我们爬虫程序。因为有的页面的入口有很多,我们可以通过不同的URL调度路径来访问这个界面,那么作为一个智能的爬虫软件,当遇到我们已经爬取过的URL的时候,应该选择过滤,而不是再次爬取。URL管理器就是用来存储已经爬取URL和将要爬取URL的工具的。
从URL管理器中选择一个待爬取的URL,将其传送给网页下载器,下载器会把网页以字符串的形式下载下来,并把这个字符串交给网页解析器去解析,网页解析器一方面会把你需要获取的价值信息提取出来归还给调度器,另一方面,如果遇到该网页有新的URL待爬取,就会把这个URL传送给URL管理器。从此,这三个模块进行循环,直到该网页相关的所有URL都爬取完毕。
更加清晰的动态运行流程,可以用一个时序图来表示。大家可以对照着上面的步骤理解下。
题外话,时序图是我最喜欢的一种帮助梳理逻辑的图,大家可以学习一下,在工作和学习过程中会帮助很大~
最近在后台很多同学问我,我现在也是在学习Python,到底应该是学2还是学3呢,其实这个问题我在往期的历史文章已经有过分享,但是就最近的情况,我觉得应该有必要再讲一下:
看到很多新同学在学习Python的过程中,犹豫学习Python 2还是学习Python 3而迟迟不行动,白白地浪费了大把时间,错过了升职加薪的机会,我真心觉得非常遗憾。所以,我忍不住想对大家粗暴一次,给大家一个粗暴而又正确的答案:
应该学习Python 2还是Python 3?
都要学!
这个答案可能很出乎意料,也很容易反驳,例如:
Python 3 才是Python的未来
Python 官方都建议指直接学习Python 3
Python 2 只维护到2020年
真的是这样吗?作为一个还在一线互联网公司奋斗的技术专家,也是一个多年的Python老手,大家不妨来看看我这么说的理由。
为什么还要学习Python 2
Python 2只维护到2020年不应该成为你拒绝Python 2的理由
所有纠结学习Python 2还是Python 3的朋友都知道,按照Python官方的计划,Python 2只支持到2020年。可能大家接触Python的时间还不长,不知道Python官方曾经还说过,Python 2只支持到2015年(https://github.com/python/peps/blob/master/pep-0373.txt)。所以,大家可以看到,跳票不是中国人的特权,Python官方也是会跳票的。
如果大家关注科技新闻的话,会注意到,就在前几天,微软刚宣布将在2020年对Win 7停止任何技术支持,之后即使遇到BUG和安全问题,他们也不会再修复,就像现在的XP一样。但是,大家看看我们周围的同事、朋友、亲戚,到底是用Win 7的多还是用Win 10的多?这些用Win 7的人有吵着说我要升级Windows的吗?用Win 10的人有吵着让用Win 7的人升级吗?
但是,在Python这个圈子,就是有很多人吵着要让别人升级Python 3。很多时候用户并不关心自己用的是Python 2还是Python 3,只要能用就行。所以,用Python 2的人并没有什么动力去升级到Python 3。
如果你觉得,Python 3才是Python的未来,不希望接触Python 2的项目。那么,问题来了,女神跟你说,晚上来我家给我修下电脑呗,但是我的电脑是Windows XP的,你是去还是不去?
Python官方建议学习Python 3只是一种一厢情愿的行为
我们来看一下Python 2和Python 3的下载统计数据(http://www.randalolson.com/2016/09/03/python-2-7-still-reigns-supreme-in-pip-installs/):
Python 2的使用量远远超过Python 3。而且,大家注意竖轴的单位,是指数!简单换算一下就知道,仅从下载量来说,Python 2.7的下载量是总下载量的90%!所以,学习Python,想直接抛弃Python 2学习Python 3,几乎是不可能的事情。
上面的数据是全球范围的统计数据,我们来看看中国互联网的情况。为了写这篇文章,我专门在同学群里面发了红包,邀请了来自百度、阿里、腾讯、网易、美团、华为、招行、建行、eBay、美图、Oracle等公司的一线技术专家,统计了各大公司使用Python的情况。
统计数据如下:
10% 使用 Python 3
20% 既使用Python 2也使用Python 3,Python 2用的更多
70% 使用Python 2
统计数据基本与pypi的全球范围的统计数据吻合。所以,如果你说,我一开始学的就是Python 3,Python 3也是Python的未来,我不想去了解和学习Python 2。那么,你可能要和大半个中国互联网失之交臂了。或许你也不在乎,但是,如果有人拿钱砸你让你维护Python 2的代码呢?
Python 2还会存在很长一段时间
不知道大家有没有想过,为什么Python官方极力让大家使用Python 3,而Python 2依然处于统治地位呢?
其实答案很简单也很粗暴:因为绝大多数人,你给他什么,他就用什么。据我说知,尽管Python 3在2008年12月就已经发布了,但是,目前Python 3仍然不是任何操作系统的默认Python解释器,这是Python 3使用不广泛的主要原因。
我们都知道,在任何一家公司,升级服务器的操作系统版本都是一个很慎重事情。所以,我们有理由相信,Python 2还会存在很长一段时间。很长是多长呢?至少比2020年还要长。
这个世界并不是非黑即白的,Python也不是
有了前面的数据做支撑,我们不是应该学习Python 2吗,为什么Python 2和Python 3都要学呢?
首先,这个世界并不是非黑即白的,Python也不是。在学习Python 2和学习Python 3中间,其实有一个很好的平衡,那就是同时兼容Python 2和Python 3。为了做到同时兼容Python 2和Python 3,需要深用到Python的
__future__
库。
__future__
库里面包含了不少从Python 3 backport 到Python 2的特性,充分使用
__future__
库,可以很好的兼容Python 2和Python 3。
其次,Python 2和Python 3确实有一些差异,但是,并没有大家想象的那么大,Python 2和Python 3之间的差异不到Python语法的10%,我们可以快速地了解哪些Python 2里面的语法在Python 3中已经被弃用,在我们写代码的过程中,规避掉这一部分语法即可。在Python的最佳实践中,Python 3里弃用的Python语法,在Python 2里面也不推荐使用,不然也不会被弃用了。如果你知道并坚持Python的最佳实践,那么,对你来说,Python 2和Python 3的差异就更小了。
最后,我们可以参考优秀的开源软件的做法,如OpenStack,努力做到代码同时兼容Python 2和Python 3(https://wiki.openstack.org/wiki/Python3),也可以借助一些开软的库(如six)来同时兼容。如果能够做到同时兼容Python 2和Python 3,我们的使用者将更广泛,我们的代码也将更有价值。
stop talking, just do it
前面说了我对学习Python 2还是Python 3的一些观点,希望能够帮助大家少走弯路,另外,关于Python的版本问题,我这里还有一些良心建议:
学习Python前,先了解在Python 3里面已经弃用的Python 2语法,对这些部分简单带过不要花太多时间
使用Python 2,不要使用Python 2.7以前的版本
使用Python 3,不要使用Python 3.4以前的版本
多了解Python 2的
__future__
库
对同一份代码,不要为Python 2和Python 3分别维护分支,努力在一套代码中兼容Python 2和Python 3
这篇文章详细的说明了为什么要同时学习Python 2和Python 3,如何在Python 2和Python 3中找到一个平衡。但是,重要的不是纠结学习Python 3还是Python 2,而是“stop talking, just do it!”。新的一年,不妨给自己定个小目标吧,比如,在18年精通Python?
为你准备的Python学习交流群,和千人一起学习Python。