• 章节一:认识爬虫


    章节一:认识爬虫

    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.4kB
    image.png-1025.4kB
    image.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()
    
  • 相关阅读:
    学习PetShop3.0(9)工厂的资料
    net程序架构开发
    《解剖PetShop》系列之一
    与数据库相关的名词解释
    asp 导出Excel
    《解剖PetShop》系列之二
    业务模块的设计原则
    《解剖PetShop》系列之三
    JAVA之BigInteger(转)【转】【很好用啊】
    php_mcrypt.dll无法加载解决方法
  • 原文地址:https://www.cnblogs.com/ywb123/p/16392343.html
Copyright © 2020-2023  润新知