从现在起,Python真正有趣的地方正式开始——我们要利用模块,上手做项目!
那么问题来了:模块是什么东西?
答,一个模块就是一个py文件,里面有别人已经写好的类、方法、属性、函数、变量……
或许你会好奇什么是py文件?它是一种文件格式,用来保存你写的Python代码。就仿佛是你使用doc格式的文件,来保存你写的文字一样。
如果有人写了一段能够实现文件下载的代码,他把这个py文件共享到网络上。那么所有人,都可以把这个文件下载到自己的电脑上来使用。
有没有感觉,很像你手机上的一个个应用程序?有人写了一个能够发邮件的软件,他把这个软件共享到网络上。那么所有人,都可以把这个软件下载到自己的手机,然后去发邮件。
因为一个模块就只是一个py文件,可以想象,在Python的世界里有很多这样的模块。那要是重名可怎么办?一个可行的方法是:把模块分类存储,放进不同的文件夹。这种文件夹我们把它叫做包(package)。
电脑的文件夹里面既可以有文件,也可以有它的子文件夹,包也是如此。包里面可以有模块,也可以有它的子包。一般来说,一个包会被专门用来解决一类问题。
在开发一个大型项目时,单凭一个团体或是一个人根本没办法写完所有的代码。但正因为有模块和包的存在,每个功能只要有一个人把它写出来,并共享到网络上。那么每一个开发者,都能在它的帮助下完成自己的项目。如此,整个互联网世界的效率都得到质的提升。
Python有许多内置的模块,在网络上也有许多优秀的开发者在分享着自己编写的代码。他们不计辛劳,不计报酬地付出,只是为了思想的碰撞,技术的交流,为了帮助其他人提升效率,共同推动互联网进步。
这就是开源精神,就是黑客文化,整个互联网世界最为宝贵的精神财富,没有之一。
我们接下来的主要任务就是:掌握如何使用模块,使用这些模块完成自己想做的项目!
在此,我们将会选取几个和“爬虫项目”相关的模块来作为案例,来教给你“模块”的使用方法。
所以除模块的使用方法之外,你还能学到项目如何一步一步从0到1的思路。
而在更远的未来,当你掌握足够多的知识,希望你也能写出一些优雅的“模块”,在网络上共享,帮别人来提升效率。
现在,我们要开始制作网络爬虫!
当我们在说“上网冲浪”这个复古的词汇时,本质上是说:我们在使用各种软件,从网络上下载和上传数据。
网络爬虫的意思,就是这活我们不要自己干啦,让程序去做。就仿佛是一只只小蜘蛛,在互联网上爬来爬去,按照我们设计的规则,找到我们想要的内容。
专业的说法,叫web抓取。
那它都能做什么呢?对个人来说,它能——
能做商业分析:北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资多少?麦当劳的选址策略是什么?豆瓣上有哪些高分的书籍?
能做舆情监测:关于公司有什么最新的负面新闻?用户如何看待我们的新产品?
能做生活助手:我的快递到了哪儿?哪家店卖的手机最便宜?输入电影名就帮我下载好电影?北京有哪家川菜馆子最好吃?
……
除此之外,你所知道的搜索引擎,谷歌/百度,它们的本质也是爬虫。抓取各个网站上的信息,放在自家网站,供人搜索和跳转。
你所知道的智能音箱,它们的工作逻辑,也是把你说的话上传到服务器,由服务器做语音识别/语义理解,再把执行的结果返回给你的智能设备。所谓的智能音箱,不过是个能联网的音箱,本身并不智能。它所用的技术,和你即将学会的,并没有太大区别。
同时,爬虫技术也被用在许多灰色产业:娱乐/出行抢票、微博僵尸粉刷赞刷评论、针对关键词刷点击量换取搜索引擎的更高排名(俗称SEO)、抓取政府公示的企业信用信息制作信用系统……
但不论如何,爬虫工作都能分为两个阶段:第0,获取数据;第1,解析数据。
我们会用这些知识完成一些特别酷(而无害)的项目:复制电影名,直接下载电影;人工智能对话;抓取附近的餐厅;查快递;测量英语词汇量……
我们现在将学的是:获取数据。它涉及到的模块是requests。
学习模块的过程一点儿也不会复杂,主要分下面几步:
其中,前面的两步实在过于简单,我们等下会用很短的篇幅带过。而后面的两步,针对每个模块,我们只需要搞懂三个问题:模块能做什么?需要我输入什么?得到的对象有哪些属性和方法可用?
在我们课程的系统里,已经帮你预装好requests模块。
如果你希望在电脑上安装,方法是打开终端软件(windows电脑里叫命令提示符),输入pip3 install requests,然后点击enter即可。注:此处,需要预装python解释器和pip,安装教程在副本《本地安装软件》内有提供。
而安装别的模块,也是同样的操作。在终端里输入:pip3 install + 你想安装的模块名。
然后是调用这个模块,语法也蛮简单。大概长这样:
如果需要调用多个模块,在模块之间用英文逗号分隔即可。当然有时候,我们还会遇到别的调用模块语法,这个不急到时候再说。
下面我们来介绍requests模块:它可以帮我们下载网页源代码(如果你不知道这是什么,我们会在下一关卡介绍)/文本/图片,甚至是音频。
requests模块,是这样用的:
我们来举个例子:
那我们现在来尝试,下载一本电子书,《三国演义》的第一回。网址我已经帮你找好,在这里:https://static.pandateacher.com/sanguo.md
理论上来说,我们已经下载好电子书,存储在变量sanguo里,现在我们想打开它看怎么办?
想当然的解决方案是,print (sanguo),我们来试试看:抄写上面的代码,并且在最后加一行print(sanguo)的代码。
你会看到这样的一个结果:
根据上一关所学的知识,我们能看明白的是:sanguo是一个对象,属于requests.models.Response类。
如果这是一个对象,我们就要去了解它的属性和它的方法。应该怎样去做?
我们先前有讲过,当遇到程序报错时,可以直接去搜索报错内容,来寻求解决方案。
而当我们在使用第三方模块时,还有一种有效的方案,是去查找该模块的说明文档。比如,requests的说明文档:http://cn.python-requests.org/zh_CN/latest/
一份说明文档,往往会将该模块的用法解析得非常透彻,这是最好的说明书,善用它。对于新手来说,直接查看说明文档,可能还有些困难。所以这一关,我会带着你去做
打开【用户指南】-【快速上手】,利用浏览器的查找功能ctrf+f进行搜索“Response”,可以得到:
如文档中所说的:>>> r = requests.get('https://api.github.com/events')
我们利用requests.get函数得到的,是一个Response类的对象。我们可以从这个对象中获取所有我们想要的信息。
我们已经学过处理对象的技巧:对象具备一些属性与方法,可以被我们调用。
在requests模块的设计当中,这个对象,并不支持我们直接去print,所以结果会显示,而不是“滚滚长江东逝水……”
现在我们要学习怎样调用。
接着浏览用户指南,你会看到:
答案出来了,Response对象有一个方法是text,可以提取文本。还记得我们讲过的,如何调用方法吗?你可以这样写代码:
因为整个文档的内容太长,所以我们只打印前八百字就好。看最后一行代码,sanguo.text即是代表文本内容了,然后给它的后面加一个[:800]代表只输出前八百个字。还记得吗?你在学习列表时,见过这种用法。
然后,我们就得到:滚滚长江东逝水,浪花淘尽英雄……
使用同样的代码,你能够打印出任意网页的源代码,你可以去尝试下。
至此,我们已经下载好想要的东西。就差一步,是将它保存为本地文档。我们之前讲过这个知识点,所以下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。
同样的原理,我们也可以用来下载图片和音频。只是此时,我们就不能再用text的方法,要用content方法。
上面我们展示了Response对象其中一个用法:给变量名后面加.text是输出文本。如果你下载的是网页源代码,或者是一个txt格式的电子书,那么这种方式会很好用。
在这它还有另外一种方法是content,含义是以2进制获取内容,这样做赋值是内容全保留的。如果我们不需要print下载的内容,那么用这种方式也会很棒。比如,下载图片或者下载音频。
就像下面的这两个案例。记得要读代码的注释。
以上,我们就学完requests的基本用法。
还有更多有趣的东西,我放在了本关卡作业,和后面的内容。
现在,让我们复习一下刚刚学习的内容:
结束。