爬虫知识点及其小试

什么是爬虫/h1>

什么是爬虫br> 到底什么是爬虫呢br> 爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少圳的Python工程师平均薪资是多少京哪家餐厅粤菜最好吃等。
这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。

爬虫知识点及其小试
这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。
爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。
从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。

爬虫的工作原理

Created with Rapha2.3.0 获取数据 解析数据 提取数据 存储数据 yes

第0步:获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。
第1步:解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。
第2步:提取数据。爬虫程序再从中提取出我们需要的数据。
第3步:储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
这就是爬虫的工作原理啦,无论之后的学习内容怎样变化,其核心都是爬虫原理。

体验爬虫

在进行爬虫时,我们会用到一个强大的库-requests库来获取数据
安装方法:在Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击enter即可;Windows电脑里叫命令提示符(cmd),输入pip install requests 即可。

requests库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。

先来看requests.get()方法。

requests.get()

requests.get()的具体用法如下,请仔细阅读注释噢:

第2行代码,是引用requests库。

第6行代码,requests.get()发送了请求,然后得到了服务器的响应。服务器返回的结果是个Response对象,现在存储到了我们定义的变量res中。

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

Response对象的常用属性

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

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

终端显示:

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

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

response.status_code:检查请求是否成功
response.content:把response对象转换为二进制对象
response.text:把response对象转为字符串数据
response.encoding:定义response对象的编码

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

接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。
假如我们想下载这张图片,它的URL是:https://img0.baidu.com/it/u=2921493010,3508718203&fm=253&fmt=auto&app=138&f=JPEG=505&h=500

爬虫知识点及其小试

之后,我们就可以用通过读写文件把小说保存到本地了。

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

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

诶,为什么会出现一段乱码呢/p>

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

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

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

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

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

如果我们把第7行代码换成utf-8,打印出来就没问题了。
这只是个示范,是为了让大家理解res.encoding的意义,也就是它能定义Response对象的编码类型。

那在真实的情况中,我们该在什么时候用res.encoding呢/strong>

首先,目标数据本身的编码方式是未知的。用requests.get()发送请求后,我们会取得一个Response对象,其中,requests库会对数据的编码类型做出自己的判断。但是!这个判断有可能准确,也可能不准确。比如你发给我一张“法语”字条,我看不出来是什么语言,猜测可能是“俄语”,“德语”等。

如果它判断准确的话,我们打印出来的response.text的内容就是正常的、没有乱码的,那就用不到res.encoding;如果判断不准确,就会出现一堆乱码,那我们就可以去查看目标数据的编码,然后再用res.encoding把编码定义成和目标数据一致的类型即可。

总的来说,就是遇上文本的乱码问题,才考虑用res.encoding。

爬取音频

以上的爬取案例均为最简单的,未经过加密的,可以直接进行爬取。其他更复杂的就需要自己更深层次的学习了。

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树预备知识Python简介209349 人正在系统学习中

来源:Hello world !

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月7日
下一篇 2022年4月7日

相关推荐