Python小课——第14关 重新定义上网冲浪——requests模块

从现在起,Python真正有趣的地方正式开始——我们要利用模块,上手做项目!

那么问题来了:模块是什么东西?

答,一个模块就是一个py文件,里面有别人已经写好的类、方法、属性、函数、变量……

或许你会好奇什么是py文件?它是一种文件格式,用来保存你写的Python代码。就仿佛是你使用doc格式的文件,来保存你写的文字一样。

如果有人写了一段能够实现文件下载的代码,他把这个py文件共享到网络上。那么所有人,都可以把这个文件下载到自己的电脑上来使用。

有没有感觉,很像你手机上的一个个应用程序?有人写了一个能够发邮件的软件,他把这个软件共享到网络上。那么所有人,都可以把这个软件下载到自己的手机,然后去发邮件。


因为一个模块就只是一个py文件,可以想象,在Python的世界里有很多这样的模块。那要是重名可怎么办?一个可行的方法是:把模块分类存储,放进不同的文件夹。这种文件夹我们把它叫做包(package)。


1

电脑的文件夹里面既可以有文件,也可以有它的子文件夹,包也是如此。包里面可以有模块,也可以有它的子包。一般来说,一个包会被专门用来解决一类问题。

在开发一个大型项目时,单凭一个团体或是一个人根本没办法写完所有的代码。但正因为有模块和包的存在,每个功能只要有一个人把它写出来,并共享到网络上。那么每一个开发者,都能在它的帮助下完成自己的项目。如此,整个互联网世界的效率都得到质的提升。

Python有许多内置的模块,在网络上也有许多优秀的开发者在分享着自己编写的代码。他们不计辛劳,不计报酬地付出,只是为了思想的碰撞,技术的交流,为了帮助其他人提升效率,共同推动互联网进步。

这就是开源精神,就是黑客文化,整个互联网世界最为宝贵的精神财富,没有之一。

我们接下来的主要任务就是:掌握如何使用模块,使用这些模块完成自己想做的项目!

2

在此,我们将会选取几个和“爬虫项目”相关的模块来作为案例,来教给你“模块”的使用方法。

所以除模块的使用方法之外,你还能学到项目如何一步一步从0到1的思路。

而在更远的未来,当你掌握足够多的知识,希望你也能写出一些优雅的“模块”,在网络上共享,帮别人来提升效率。

现在,我们要开始制作网络爬虫!

当我们在说“上网冲浪”这个复古的词汇时,本质上是说:我们在使用各种软件,从网络上下载和上传数据。

网络爬虫的意思,就是这活我们不要自己干啦,让程序去做。就仿佛是一只只小蜘蛛,在互联网上爬来爬去,按照我们设计的规则,找到我们想要的内容。

3

专业的说法,叫web抓取。

那它都能做什么呢?对个人来说,它能——

能做商业分析:北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资多少?麦当劳的选址策略是什么?豆瓣上有哪些高分的书籍?

能做舆情监测:关于公司有什么最新的负面新闻?用户如何看待我们的新产品?

能做生活助手:我的快递到了哪儿?哪家店卖的手机最便宜?输入电影名就帮我下载好电影?北京有哪家川菜馆子最好吃?

……

除此之外,你所知道的搜索引擎,谷歌/百度,它们的本质也是爬虫。抓取各个网站上的信息,放在自家网站,供人搜索和跳转。

你所知道的智能音箱,它们的工作逻辑,也是把你说的话上传到服务器,由服务器做语音识别/语义理解,再把执行的结果返回给你的智能设备。所谓的智能音箱,不过是个能联网的音箱,本身并不智能。它所用的技术,和你即将学会的,并没有太大区别。

同时,爬虫技术也被用在许多灰色产业:娱乐/出行抢票、微博僵尸粉刷赞刷评论、针对关键词刷点击量换取搜索引擎的更高排名(俗称SEO)、抓取政府公示的企业信用信息制作信用系统……

但不论如何,爬虫工作都能分为两个阶段:第0,获取数据;第1,解析数据。

3


我们会用这些知识完成一些特别酷(而无害)的项目:复制电影名,直接下载电影;人工智能对话;抓取附近的餐厅;查快递;测量英语词汇量……

我们现在将学的是:获取数据。它涉及到的模块是requests。

学习模块的过程一点儿也不会复杂,主要分下面几步:

4

其中,前面的两步实在过于简单,我们等下会用很短的篇幅带过。而后面的两步,针对每个模块,我们只需要搞懂三个问题:模块能做什么?需要我输入什么?得到的对象有哪些属性和方法可用?

5

在我们课程的系统里,已经帮你预装好requests模块。

如果你希望在电脑上安装,方法是打开终端软件(windows电脑里叫命令提示符),输入pip3 install requests,然后点击enter即可。注:此处,需要预装python解释器和pip,安装教程在副本《本地安装软件》内有提供。

6

而安装别的模块,也是同样的操作。在终端里输入:pip3 install + 你想安装的模块名。

然后是调用这个模块,语法也蛮简单。大概长这样:

7


如果需要调用多个模块,在模块之间用英文逗号分隔即可。当然有时候,我们还会遇到别的调用模块语法,这个不急到时候再说。

下面我们来介绍requests模块:它可以帮我们下载网页源代码(如果你不知道这是什么,我们会在下一关卡介绍)/文本/图片,甚至是音频。

requests模块,是这样用的:

8

我们来举个例子:

9

那我们现在来尝试,下载一本电子书,《三国演义》的第一回。网址我已经帮你找好,在这里:https://static.pandateacher.com/sanguo.md

10

理论上来说,我们已经下载好电子书,存储在变量sanguo里,现在我们想打开它看怎么办?

想当然的解决方案是,print (sanguo),我们来试试看:抄写上面的代码,并且在最后加一行print(sanguo)的代码。

11

你会看到这样的一个结果:

根据上一关所学的知识,我们能看明白的是:sanguo是一个对象,属于requests.models.Response类。

如果这是一个对象,我们就要去了解它的属性和它的方法。应该怎样去做?

我们先前有讲过,当遇到程序报错时,可以直接去搜索报错内容,来寻求解决方案。

而当我们在使用第三方模块时,还有一种有效的方案,是去查找该模块的说明文档。比如,requests的说明文档:http://cn.python-requests.org/zh_CN/latest/

一份说明文档,往往会将该模块的用法解析得非常透彻,这是最好的说明书,善用它。对于新手来说,直接查看说明文档,可能还有些困难。所以这一关,我会带着你去做

打开【用户指南】-【快速上手】,利用浏览器的查找功能ctrf+f进行搜索“Response”,可以得到:

12

如文档中所说的:>>> r = requests.get('https://api.github.com/events')

我们利用requests.get函数得到的,是一个Response类的对象。我们可以从这个对象中获取所有我们想要的信息。

我们已经学过处理对象的技巧:对象具备一些属性与方法,可以被我们调用。

在requests模块的设计当中,这个对象,并不支持我们直接去print,所以结果会显示,而不是“滚滚长江东逝水……”

现在我们要学习怎样调用。

接着浏览用户指南,你会看到:

13

答案出来了,Response对象有一个方法是text,可以提取文本。还记得我们讲过的,如何调用方法吗?你可以这样写代码:

14

因为整个文档的内容太长,所以我们只打印前八百字就好。看最后一行代码,sanguo.text即是代表文本内容了,然后给它的后面加一个[:800]代表只输出前八百个字。还记得吗?你在学习列表时,见过这种用法。

然后,我们就得到:滚滚长江东逝水,浪花淘尽英雄……

15

使用同样的代码,你能够打印出任意网页的源代码,你可以去尝试下。

至此,我们已经下载好想要的东西。就差一步,是将它保存为本地文档。我们之前讲过这个知识点,所以下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。

16

同样的原理,我们也可以用来下载图片和音频。只是此时,我们就不能再用text的方法,要用content方法。

17

上面我们展示了Response对象其中一个用法:给变量名后面加.text是输出文本。如果你下载的是网页源代码,或者是一个txt格式的电子书,那么这种方式会很好用。

在这它还有另外一种方法是content,含义是以2进制获取内容,这样做赋值是内容全保留的。如果我们不需要print下载的内容,那么用这种方式也会很棒。比如,下载图片或者下载音频。

就像下面的这两个案例。记得要读代码的注释。

18
19

以上,我们就学完requests的基本用法。

20

还有更多有趣的东西,我放在了本关卡作业,和后面的内容。

现在,让我们复习一下刚刚学习的内容:


结束。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,841评论 25 707
  • 小寨老了。 是真的老了,老的连啥时间丢了自家的宝都说不清了。 六、七十年代,那时我年幼,但至今仍清晰地记得满寨子,...
    岁月之平凡阅读 1,449评论 112 64
  • 已是深夜,一玩的不错的哥们发来条消息,“看上你也是不容易”,我回了句,看上我的都瞎了,他只回了两个字,“我瞎。”我...
    俞微凉阅读 508评论 0 1
  • 烟雾缭绕,满屋子都是白烟,妈在熏艾。 只见那艾叶上沾了火星,也不旺也不烧,就只是闪着一个小红点...
    想当大佬阅读 394评论 0 0