章节一:认识爬虫

章节一:认识爬虫

1. 初识爬虫

1.1 什么是爬虫?

到底什么是爬虫呢?

爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。

爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。

这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。

以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。

image.png-113.8kB

点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。

image.png-194.3kB

这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。

爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。

从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。

1.2 为什么需要爬虫?

前面听我说了爬虫在个人生活、公司业务等方面能做的事,那都是别人“爬虫日常”的一角。现在我希望你稍稍停下来想一想,你最希望用爬虫做什么?有明确的目标么,还是正在摸索中?要知道,学海从不风平浪静,只有把自己的目标像灯塔一样立起来,才不易迷失。

其实回答我的问题并不重要,重要的是,老师希望现在的你无论有明确具体的目标还是没有,都能重视自己的需求和目标,并且常常回顾,或许可以找一个你习惯的方式写出来,挂在哪里,电脑或日记本都好。当你疲惫或迷茫的时候拿出来看一下,这在情怀领域大概可以叫“不忘初心”。

总之,希望大家的学习之路能“靡不有初”且“靡不有终”。

现在,我们对爬虫有了初步的印象,知道了爬虫能做什么,思考了自己想做什么,那我们接下来来看看,爬虫是如何做到这些事的。

2. 明晰路径

一般来说,传统的拿数据的做法是:通过浏览器上网,手动下载所需要的数据。其实在这背后,浏览器做了很多我们看不见的工作,而只有了解浏览器的工作原理后,才能真正理解爬虫在帮我们做什么。

所以,我们先来看看浏览器的工作原理。

2.1 浏览器的工作原理

我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。

image.png-318.7kB

在这个网站上有几篇文章。假设,我们想收藏首页的文章标题和文章摘要,我们可能会复制粘贴到本地文档。

其实这个过程,是一个人和浏览器在交流的过程,请看下图:

image.png-45.6kB

实不相瞒,在这个过程中,浏览器的交流对象不只有你,还有【服务器】。我们可以把服务器理解为一个超级电脑,它可以计算和存储大量数据,并且在互联网中互相传输数据。

更完整的交流过程是下图这样的:

image.png-59kB

首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。

紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。

所以浏览器和服务器之间,先请求,后响应,有这么一层关系。

image.png-31kB

好,继续看:

image.png-59kB

当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成你能看得懂的样子,这是浏览器做的另一项工作【解析数据】。

紧接着,我们就可以在拿到的数据中,挑选出对我们有用的数据,这是【提取数据】。

最后,我们把这些有用的数据保存好,这是【存储数据】。

以上,就是浏览器的工作原理,是人、浏览器、服务器三者之间的交流过程。

可这和爬虫有什么关系呢?

2.2 爬虫的工作原理

其实,爬虫可以帮我们代劳这个过程的其中几步,请看下图:

image.png-60kB

当你决定去某个网页后,首先,爬虫可以模拟浏览器去向服务器发出请求;其次,等服务器响应后,爬虫程序还可以代替浏览器帮我们解析数据;接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;最后,爬虫可以批量地把数据存储到本地。

这就是爬虫做的事。简化上图,就是爬虫的工作原理了:

image.png-49.6kB

其实,还可以把最开始的【请求——响应】封装为一个步骤——获取数据。由此,我们得出,爬虫的工作分为四步:

image.png-38.2kB

第0步:获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。

第1步:解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。

第2步:提取数据。爬虫程序再从中提取出我们需要的数据。

第3步:储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。

这就是爬虫的工作原理啦,无论之后的学习内容怎样变化,其核心都是爬虫原理。

下面,我们快速浏览一下整个关卡的学习大纲。大纲展示了我们将如何逐步学习和掌握爬虫这项技能,了解即可。

2.3 爬虫学习大纲

image.png-129.4kB

第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,这就是我们风变爬虫课主页的URL,如图所示:

image.png-30.5kB

URL的功能从它的常用别名“网址”以及它所在的位置“地址栏”联想一下就很好理解了:它指示了一个网页在网络上的地址,就像我们住的房子在地球上的详细到某某街道某某号的具体地址。

再啰嗦一句,已知URL(网址),想打开网页的时候,只要把整个URL粘贴到浏览器地址栏,按个回车就可以了。

如果用图片展示requests.get()的工作过程,那就是这样的:

image.png-27.8kB

现在,我们试着用requests.get()来下载一个小说——《三国演义》:

image.png-1327.4kB

为了方便教学,这篇小说在我们的教学网站里,它目前还很简单,直接把小说的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()的用法了。

请你抄写上面的代码,然后点击运行:

image.png-143.7kB

继续往下走:

3.2 Response对象的常用属性

Python是一门面向对象编程的语言,而在爬虫中,理解数据是什么对象是非常、特别、以及极其重要的一件事。因为只有知道了数据是什么对象,我们才知道对象有什么属性和方法可供我们操作。

所以,我们现在来打印看看刚刚用requests.get()获取到的数据是什么,请点击运行下面的程序:

image.png-160.7kB

终端显示:

这代表着:res是一个对象,属于requests.models.Response类。好,既然已经知道res是一个Response对象了,我们也就可以去了解它的相应属性和方法了。

我们主要讲Response对象常用的四个属性:

image.png-105.1kB

首先是response.status_code,直接看用法。在看完代码后,请点击运行。

image.png-147.6kB

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,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。

image.png-45.6kB

response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。

image.png-81.7kB

接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。

假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png

image.png-157.4kB

那么代码可以这样写:

image.png-257.8kB

# 引入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()

这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。

image.png-1765.1kB

讲完了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])

请你自己写一遍上面的代码,并点击运行。

image.png-1067.2kB

不错嘛,O(∩_∩)O~~

之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。

image.png-235.6kB

# 引入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()

查看执行结果:

image.png-320.3kB

接下来,我们看最后一个属性:response.encoding,它能帮我们定义Response对象的编码。

我们仍然以三国演义的小说来做示范,请看下面的代码(第7行为新增代码),然后点击运行:

image.png-784.8kB

诶,为什么会出现一段乱码呢?

事情是这样的:首先,目标数据本身有它的编码类型,这个《三国演义》URL中的数据类型是'utf-8'。获取目标数据后要知道相应的编码类型才能正确解码。

编解码要共享同一种编码类型,就像你给我传纸条用的编码方式如果是“拼音”,我收到后就要拼“拼音”来理解语意——若我以为是“英语”,去查英语字典,那必然看不懂你说了什么。

那么,回看之前的【练习:下载文章《三国演义》第一回并打印】,终端是怎么“知道”编码类型并将文字正确打印显示的呢?

事实上,requests.get()发送请求后,我们得到一个Response对象,其中,requests模块会对数据的编码类型做出自己的判断。

但是,第7行的代码不管原来的判断是什么,直接定义了Response对象的编码类型是'gbk'。这样一来,跟数据本身的编码'utf-8'就不一致了,所以打印出来,就是一堆乱码。就像我虽然看出这是个“拼音”字条,但有人一定要我按照“英文”解释一下,不乱码还能怎样呢,我太难了。

如果我们把第7行代码换成下面这样,打印出来就没问题了,请你阅读代码,然后点击运行:

image.png-636.5kB

# 引用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对象常见的四个属性就讲完了。

如果用一张图来总结,那就是这样的:

image.png-46.5kB

可以看到,爬虫的第0步:获取数据,本质就是通过URL去向服务器发出请求,服务器再把相关内容封装成一个Response对象返回给我们,这是通过requests.get()实现的,而我们获取到的Response对象下有四个常用的属性。

同学们要注意这种从URLResponse这种操作对象的转换关系。

好啦,你已经知道怎么用requests库来获取数据了,爬虫的第0步你就搞定了,此处应该有掌声。

image.png-23.8kB

说完了和爬虫相关的知识,在本关卡的最后,还想跟你聊聊和爬虫有关的道德准则。

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域名下的任何网页。

有趣的是,淘宝限制了百度对产品页面的爬虫,却允许谷歌访问。

所以,当你在百度搜索“淘宝网”时,会看到下图的这两行小字。

image.png-65.6kB

因为百度很好地遵守了淘宝网的robots.txt协议,自然,你在百度中也查不到淘宝网的具体商品信息了。

互联网并非法外之地,和爬虫相关的法律也在建立和完善之中,目前通用的伦理规范就是robots协议,我们在爬取网络中的信息时,应该有意识地去遵守这个协议。

网站的服务器被爬虫爬得多了,也会受到较大的压力,因此,各大网站也会做一些反爬虫的措施。不过呢,有反爬虫,也就有相应的反反爬虫,这些我们会在后面关卡中会详细说。

爬虫就像是核技术,人们可以利用它去做有用的事,也能利用它去搞破坏。

恶意消耗别人的服务器资源,是一件不道德的事,恶意爬取一些不被允许的数据,还可能会引起严重的法律后果。

工具在你手中,如何利用它是你的选择。当你在爬取网站数据的时候,别忘了先看看网站的robots协议是否允许你去爬取。

同时,限制好爬虫的速度,对提供数据的服务器心存感谢,避免给它造成太大压力,维持良好的互联网秩序,也是我们该做的事。

简单复习一下:今天,我们知道了爬虫的本质是利用程序帮我们获取有价值的信息,爬虫程序可以消灭重复劳动,并且创造价值。

接着,我们了解了浏览器的工作原理。

image.png-59kB

由此延伸到爬虫的工作原理,并知道了爬虫的四个步骤:

image.png-49.6kB

image.png-38.2kB

并且通过学习requests库,完成了爬虫的第0步,也成功下载了小说和图片。

image.png-46.5kB

最后,我们知道,掌握了一项技能之后,要有所为,也要有所不为,要用爬虫做有意义的事,不去破坏规则。

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对象用合适的数据形式返回。
存储数据:
存储文件的三个步骤:打开文件,存储文件,关闭文件。

image.png-825.4kBimage.png-1025.4kBimage.png-379.4kB

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.要求:
获取下面的图片,并且储存图片。

image.png-3725.9kB

2.目的:
练习获取网上的图片文件。

3.题目要求:
获取下面的图片,并储存图片。

完成存储后,重新刷新页面,即可在【文件】内看到图片。

image.png-265.4kB

# 引入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对象用合适的数据形式返回。
存储文件
存储文件的三个步骤:打开文件,存储文件,关闭文件。

image.png-274.6kB

# 引入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()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值