章节一:认识爬虫
章节一:认识爬虫
1. 初识爬虫
1.1 什么是爬虫?
到底什么是爬虫呢?
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。
这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。
点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。
这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。
爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。
从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。
1.2 为什么需要爬虫?
前面听我说了爬虫在个人生活、公司业务等方面能做的事,那都是别人“爬虫日常”的一角。现在我希望你稍稍停下来想一想,你最希望用爬虫做什么?有明确的目标么,还是正在摸索中?要知道,学海从不风平浪静,只有把自己的目标像灯塔一样立起来,才不易迷失。
其实回答我的问题并不重要,重要的是,老师希望现在的你无论有明确具体的目标还是没有,都能重视自己的需求和目标,并且常常回顾,或许可以找一个你习惯的方式写出来,挂在哪里,电脑或日记本都好。当你疲惫或迷茫的时候拿出来看一下,这在情怀领域大概可以叫“不忘初心”。
总之,希望大家的学习之路能“靡不有初”且“靡不有终”。
现在,我们对爬虫有了初步的印象,知道了爬虫能做什么,思考了自己想做什么,那我们接下来来看看,爬虫是如何做到这些事的。
2. 明晰路径
一般来说,传统的拿数据的做法是:通过浏览器上网,手动下载所需要的数据。其实在这背后,浏览器做了很多我们看不见的工作,而只有了解浏览器的工作原理后,才能真正理解爬虫在帮我们做什么。
所以,我们先来看看浏览器的工作原理。
2.1 浏览器的工作原理
我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。
在这个网站上有几篇文章。假设,我们想收藏首页的文章标题和文章摘要,我们可能会复制粘贴到本地文档。
其实这个过程,是一个人和浏览器在交流的过程,请看下图:
实不相瞒,在这个过程中,浏览器的交流对象不只有你,还有【服务器】。我们可以把服务器理解为一个超级电脑,它可以计算和存储大量数据,并且在互联网中互相传输数据。
更完整的交流过程是下图这样的:
首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。
紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。
所以浏览器和服务器之间,先请求,后响应,有这么一层关系。
好,继续看:
当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成你能看得懂的样子,这是浏览器做的另一项工作【解析数据】。
紧接着,我们就可以在拿到的数据中,挑选出对我们有用的数据,这是【提取数据】。
最后,我们把这些有用的数据保存好,这是【存储数据】。
以上,就是浏览器的工作原理,是人、浏览器、服务器三者之间的交流过程。
可这和爬虫有什么关系呢?
2.2 爬虫的工作原理
其实,爬虫可以帮我们代劳这个过程的其中几步,请看下图:
当你决定去某个网页后,首先,爬虫可以模拟浏览器去向服务器发出请求;其次,等服务器响应后,爬虫程序还可以代替浏览器帮我们解析数据;接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;最后,爬虫可以批量地把数据存储到本地。
这就是爬虫做的事。简化上图,就是爬虫的工作原理了:
其实,还可以把最开始的【请求——响应】封装为一个步骤——获取数据。由此,我们得出,爬虫的工作分为四步:
第0步:获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。
第1步:解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。
第2步:提取数据。爬虫程序再从中提取出我们需要的数据。
第3步:储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
这就是爬虫的工作原理啦,无论之后的学习内容怎样变化,其核心都是爬虫原理。
下面,我们快速浏览一下整个关卡的学习大纲。大纲展示了我们将如何逐步学习和掌握爬虫这项技能,了解即可。
2.3 爬虫学习大纲
第0关,初识爬虫,你会了解爬虫的工作原理,写出一个简单的爬虫程序,学会爬虫的第0步:获取数据。
第1关,你将会快速入门HTML基础知识,达到读懂和修改HTML文档的水平。有了这些基础,你才能去学习如何解析数据和提取数据。
第2、3、4、5关,我会教你爬虫的第1和第2步:解析数据和提取数据。同时,你还会学到两种不同的发起请求的方式。
在第6关,你将学会存储数据,即把目标数据写入到本地的Excel表格中。到此,你就学会了爬虫完整的四个步骤,掌握了最基本的爬虫技能啦。
第7关,我们一起做一个项目,爬取一个知乎大v的所有文章,并且存到Excel中。以此,我们巩固和复习了0-6关的所有知识。第7关会是一个分水岭,后面关卡的进阶知识都建立在前7关的基础上。
第8关,学会cookies,就可以让浏览器记住你,你们可以更方便地长期保持联系,而不是在一次见面之后就相忘于江湖。
第9关,学习控制浏览器,来应对爬虫中一些更复杂的情况。第10关,你的爬虫会变得更自动化,爬虫程序不但可以定时工作,还可以把爬取结果传递给你。
接下来的4关,你将学会更高效更强大的爬虫方法,让爬虫技能升级。
第15关毕业总结,就到了告别的时刻了。这时你也学成出师,可以用爬虫知识去做自己想做的事情了,让爬虫为你消灭重复劳动,高效获取信息,创造出更多价值。
以上,就是爬虫学习大纲。
好,从宏观上理解爬虫后,接下来,我们将近距离地体验一下爬虫,也就是——写代码。
3. 体验爬虫
这一部分的任务就是学会爬虫的第0步:获取数据。
我们将会利用一个强大的库——requests
来获取数据。
在学习系统里,已经帮你预装好requests库
。如果你希望在电脑上安装,方法是:在Mac电脑里打开终端软件(terminal),输入pip3 install
requests,然后点击enter即可;Windows电脑里叫命令提示符(cmd),输入pip install requests
即可。
requests库
可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
先来看requests.get()
方法。
3.1 requests.get()
requests.get()
的具体用法如下,请仔细阅读注释噢:
# 引入requests库
import requests
# requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
# 我们把这个响应返回的结果赋值给变量res
res = requests.get('URL')
第2行代码,是引用requests库
。
第6行代码,requests.get()
发送了请求,然后得到了服务器的响应。服务器返回的结果是个Response对象,现在存储到了我们定义的变量res中。
现在看一下requests.get()
方法的参数——我们又看到了URL
,也就是我们通常说的“网址”,在接下来的学习中,你也会发现,它几乎无处(课)不在,这是一个很基础却重要的内容,我们来一起学习或复习一下,学过的同学也不用担心回忆起被考试支配的恐惧,我们目前只需要看一眼去哪里找到它,不需要记得它大名叫统一资源定位符
以及其它……
任意一个网页,在浏览器最顶部的地址栏
双击一下鼠标,显示出的全部内容就是URL
了,如果你正用网页版学习课程,鼠标双击地址栏,会看到https://www.pypypy.cn/#/apps/2/home
,这就是我们风变爬虫课主页的UR
L,如图所示:
URL
的功能从它的常用别名“网址”以及它所在的位置“地址栏”联想一下就很好理解了:它指示了一个网页在网络上的地址,就像我们住的房子在地球上的详细到某某街道某某号的具体地址。
再啰嗦一句,已知URL
(网址),想打开网页的时候,只要把整个URL
粘贴到浏览器地址栏,按个回车就可以了。
如果用图片展示requests.get()
的工作过程,那就是这样的:
现在,我们试着用requests.get()
来下载一个小说——《三国演义》:
为了方便教学,这篇小说在我们的教学网站里,它目前还很简单,直接把小说的URL(网址)给你用:
小说的URL(网址)是:https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md
那么根据所学,代码应该是这样的:
# 引入requests库
import requests
# 发送请求,并把响应结果赋值在变量res上
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
这就是基本的 requests.get()
的用法了。
请你抄写上面的代码,然后点击运行:
继续往下走:
3.2 Response对象的常用属性
Python是一门面向对象编程的语言,而在爬虫中,理解数据是什么对象是非常、特别、以及极其重要的一件事。因为只有知道了数据是什么对象,我们才知道对象有什么属性和方法可供我们操作。
所以,我们现在来打印看看刚刚用requests.get()
获取到的数据是什么,请点击运行下面的程序:
终端显示:
这代表着:res是一个对象,属于requests.models.Response
类。好,既然已经知道res
是一个Response
对象了,我们也就可以去了解它的相应属性和方法了。
我们主要讲Response
对象常用的四个属性:
首先是response.status_code
,直接看用法。在看完代码后,请点击运行。
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 打印变量res的响应状态码,以检查请求是否成功
print(res.status_code)
第5行代码是在打印res
的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200
,这个数字代表服务器同意了请求,并返回了数据给我们。
除了200
,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。
response.status_code
是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。
接着的属性是response.content
,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。
假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png
那么代码可以这样写:
# 引入requests库
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic = res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('C://Users//17310//Desktop//ceshi//ppt.jpg','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()
这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。
讲完了response.content
,继续看response.text
,这个属性可以把Response
对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
举个例子,我们还是来下载小说《三国演义》的第一回。
代码如下:
# 引用requests库
import requests
# 下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel=res.text
# 现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。
print(novel[:800])
请你自己写一遍上面的代码,并点击运行。
不错嘛,O(∩_∩)O~~
之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。
# 引入requests库
import requests
#下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel = res.text
# 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容
k = open('C://Users//17310//Desktop//ceshi//《三国演义》.txt','a+')
# 写进文件中
k.write(novel)
# 关闭文档
k.close()
查看执行结果:
接下来,我们看最后一个属性:response.encoding
,它能帮我们定义Response
对象的编码。
我们仍然以三国演义的小说来做示范,请看下面的代码(第7行为新增代码),然后点击运行:
诶,为什么会出现一段乱码呢?
事情是这样的:首先,目标数据本身有它的编码类型,这个《三国演义》URL中的数据类型是'utf-8'。获取目标数据后要知道相应的编码类型才能正确解码。
编解码要共享同一种编码类型
,就像你给我传纸条用的编码方式如果是“拼音”,我收到后就要拼“拼音”来理解语意——若我以为是“英语”,去查英语字典,那必然看不懂你说了什么。
那么,回看之前的【练习:下载文章《三国演义》第一回并打印】,终端是怎么“知道”编码类型并将文字正确打印显示的呢?
事实上,requests.get()
发送请求后,我们得到一个Response
对象,其中,requests
模块会对数据的编码类型
做出自己的判断。
但是,第7行的代码不管原来的判断是什么,直接定义了Response
对象的编码类型是'gbk'。这样一来,跟数据本身的编码'utf-8'就不一致了,所以打印出来,就是一堆乱码。就像我虽然看出这是个“拼音”字条,但有人一定要我按照“英文”解释一下,不乱码还能怎样呢,我太难了。
如果我们把第7行代码换成下面这样,打印出来就没问题了,请你阅读代码,然后点击运行:
# 引用requests库
import requests
# 下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 定义Reponse对象的编码为utf-8。
res.encoding='utf-8'
# 把Response对象的内容以字符串的形式返回
novel=res.text
# 打印小说的前800个字。
print(novel[:800])
这只是个示范,是为了让大家理解res.encoding
的意义,也就是它能定义Response
对象的编码类型。
那在真实的情况中,我们该在什么时候用res.encoding
呢?
首先,目标数据本身的编码方式是未知的。用requests.get()
发送请求后,我们会取得一个Response
对象,其中,requests
库会对数据的编码类型做出自己的判断。但是!这个判断有可能准确,也可能不准确。比如你发给我一张“法语”字条,我看不出来是什么语言,猜测可能是“俄语”,“德语”等。
如果它判断准确的话,我们打印出来的response.text
的内容就是正常的、没有乱码的,那就用不到res.encoding
;如果判断不准确,就会出现一堆乱码,那我们就可以去查看目标数据的编码,然后再用res.encoding
把编码定义成和目标数据一致的类型即可。
总的来说,就是遇上文本的乱码问题,才考虑用res.encoding
。
好,到这里,requests.get()
方法和Response
对象常见的四个属性就讲完了。
如果用一张图来总结,那就是这样的:
可以看到,爬虫的第0步:获取数据,本质就是通过URL
去向服务器发出请求,服务器再把相关内容封装成一个Response
对象返回给我们,这是通过requests.get()
实现的,而我们获取到的Response
对象下有四个常用的属性。
同学们要注意这种从URL
到Response
这种操作对象的转换关系。
好啦,你已经知道怎么用requests
库来获取数据了,爬虫的第0步你就搞定了,此处应该有掌声。
说完了和爬虫相关的知识,在本关卡的最后,还想跟你聊聊和爬虫有关的道德准则。
3.3 爬虫伦理
就像是两个人在来来往往的相处中,会考虑对方的感受;在互联网的世界中,我们也要考虑一下服务器对爬虫的感受是怎样的。
我们说过,服务器其实就是一个超级电脑,拥有这个服务器的公司,对爬虫其实也有明确的态度。
通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。
不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,通常这些条件会写在robots协议
里。
robots协议
是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
我们使用robots协议
的场景通常是:看到想获取的内容后,检查一下网站
是否允许爬取。因此我们只需要能找到
、简单读懂robots协议
就足够了。
我们截取了一部分淘宝的robots协议
,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
有的同学可能就要问了:“域名是什么?域名和URL(网址)有什么关系
?”很敏锐哟!
我们前面说过,如果把一个网页类比为一幢房子,URL
指示了网页
的地址,就像房子在地球上的详细到某某街道某某号的具体地址,那么域名
就像房子所在的国家,指示了网站
的地址。
如果我们看到一个网页,想爬上面的内容,怎么找到它的URL我们刚刚学过了,如果网页的URL是https://pypi.org/project/requests/
,那么,此网站的域名是pypi.org
;如果网页的URL是http://cn.python-requests.org/zh_CN/latest/
,那么网站的域名是cn.python-requests.org
。
我们再来看一个,如果网页的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS
,那么网站的域名是www.taobao.com
。
没错,你已经找到了规律!
有个课后思考交给你:域名中会藏着网站的国籍
或功能领域
等信息,那么.cn
,.com
,.gov
结尾的域名分别代表了什么?
来看一个实例:我们截取了一部分淘宝的robots协议 ( http://www.taobao.com/robots.txt)。在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
User-agent: Baiduspider # 百度爬虫
Allow: /article # 允许访问 article
Allow: /oshtml # 允许访问 oshtml
Allow: /ershou # 允许访问 ershou
Allow: /$ # 允许访问根目录,即淘宝主页
Disallow: /product/ # 禁止访问product文件夹下面的所有文件,但是product文件夹本身允许被访问
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
User-Agent: Googlebot # 谷歌爬虫
Allow: /article
Allow: /oshtml
Allow: /product # 允许访问product文件夹及product文件夹下面的所有文件
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
…… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接
User-Agent: * # 其他爬虫
Disallow: / # 禁止访问所有页面
可以看出robots协议是“分段”的吗?每个段落都含有以下两种字段:一种是User-agent:
,另一种是Allow:
或Disallow:
。
User-agent表示的是爬虫类型,上面的示例代码注释了“百度爬虫”和“谷歌爬虫”,我们自己写的爬虫一般要看User-Agent: *
,*指向所有未被明确提及的爬虫。
Allow代表允许被访问,Disallow代表禁止被访问。字段对应的值都含有路径分隔符/
,限制了哪些或哪一层目录的内容是允许或者禁止被访问的。可以对比上述百度爬虫Disallow: /product/
和谷歌爬虫Allow: /product
的注释行理解一下。
比如淘宝禁止其他爬虫访问所有页面,也就是说,我们自己写的爬虫不被欢迎爬取www.taobao.com
域名下的任何网页。
有趣的是,淘宝限制了百度对产品页面的爬虫,却允许谷歌访问。
所以,当你在百度搜索“淘宝网”时,会看到下图的这两行小字。
因为百度很好地遵守了淘宝网的robots.txt协议
,自然,你在百度中也查不到淘宝网的具体商品信息了。
互联网并非法外之地,和爬虫相关的法律也在建立和完善之中,目前通用的伦理规范就是robots协议
,我们在爬取网络中的信息时,应该有意识地去遵守这个协议。
网站的服务器被爬虫爬得多了,也会受到较大的压力,因此,各大网站也会做一些反爬虫的措施。不过呢,有反爬虫,也就有相应的反反爬虫,这些我们会在后面关卡中会详细说。
爬虫就像是核技术,人们可以利用它去做有用的事,也能利用它去搞破坏。
恶意消耗别人的服务器资源,是一件不道德的事,恶意爬取一些不被允许的数据,还可能会引起严重的法律后果。
工具在你手中,如何利用它是你的选择。当你在爬取网站数据的时候,别忘了先看看网站的robots协议
是否允许你去爬取。
同时,限制好爬虫的速度,对提供数据的服务器心存感谢,避免给它造成太大压力,维持良好的互联网秩序,也是我们该做的事。
简单复习一下:今天,我们知道了爬虫的本质是利用程序帮我们获取有价值的信息,爬虫程序可以消灭重复劳动,并且创造价值。
接着,我们了解了浏览器的工作原理。
由此延伸到爬虫的工作原理,并知道了爬虫的四个步骤:
并且通过学习requests库
,完成了爬虫的第0步,也成功下载了小说和图片。
最后,我们知道,掌握了一项技能之后,要有所为,也要有所不为,要用爬虫做有意义的事,不去破坏规则。
4. 习题练习
4.1 习题一
练习介绍
1.要求:
获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
2.目的:
练习获取网上的文本文件。
3.写代码吧!
题目要求:获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
获取数据:
文本URL:
https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP响应状态码.md
首先调用requests库,使用requests.get('URL')获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储数据:
存储文件的三个步骤:打开文件,存储文件,关闭文件。
import requests
destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'
res = requests.get (destnation_url)
print(res.status_code) # 查看响应码
article=res.text # 把Response对象的内容以字符串的形式返回
print(article)
4.2 习题二
练习介绍
1.要求:
获取下面的图片,并且储存图片。
2.目的:
练习获取网上的图片文件。
3.题目要求:
获取下面的图片,并储存图片。
完成存储后,重新刷新页面,即可在【文件】内看到图片。
# 引入requests库
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic = res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('C://Users//17310//Desktop//ceshi//ppt.jpg','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()
4.3 习题三
练习介绍
1.要求:
获取下面的音乐,并且储存它,然后就可以欣赏音乐啦。音乐URL:
https://static.pandateacher.com/Over The Rainbow.mp3
2.目的:
练习获取网上的音频文件。
3.写代码吧!
题目要求:
获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:
https://static.pandateacher.com/Over The Rainbow.mp3
获取数据
音乐URL:https://static.pandateacher.com/Over The Rainbow.mp3
首先调用requests库,使用requests.get('URL')获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储文件
存储文件的三个步骤:打开文件,存储文件,关闭文件。
# 引入requests库
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')
# 把Reponse对象的内容以二进制数据的形式返回
pic = res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('C://Users//17310//Desktop//ceshi//ppt.mp3','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()