Requests库的使用

HTTP协议

在开始介绍Requests库和爬虫之前,首先需要先多了解了解HTTP协议,这里就不过多的介绍了,有熟悉HTTP的可以略过,不熟悉的HTTP的可以点击下面地址,去详细的了解以下。

关于HTTP协议,一篇就够了

HTTP 协议入门- 阮一峰的网络日志

超文本传输协议- 维基百科,自由的百科全书

http_百度百科

同时推荐一个学习HTTP的书,HTTP权威指南

Requests介绍及基本使用

Requests是一个简单且优雅的Python HTTP库,相较于Python标准库中的urllib和urllib2的库,Requests更加的便于理解使用。

Requests是Python的第三方库,也是目前公认爬取网页最好的第三方库,使用起来非常简单,简洁。

Requests的安装

Requests安装非常简单,有任何问题,可通过官网查询学习。

https://requests.readthedocs.io/zh_CN/latest/

检查Requests是否安装成功

Requests库的7个主要的方法

方法说明
requests.request()构造一个请求,支撑以下各方法的基础方法
requests.get()获取HTML页面的主要方法,对应于HTTP的GET
requests.head()获取HTML页面头信息的方法,对应于HTTP的HEAD
requests.post()向HTML页面提交POST请求的方法,对应于HTTP的POST
requests.put()向HTML页面提交PUT请求的方法,对应于HTTP的PUT
requests.patch()向HTML页面提交局部修改请求,对应于HTTP的PATCH
requests.delete()向HTML页面提交删除请求,对应于HTTP的DELETE

在Requests库中有两个非常重要的对象,Request和Response。

  • Request是请求相关的所有资源
  • Response是请求返回的所有资源,在爬虫的过程中占据了非常重要的位置

Requests简单的请求过程

  1. 首先向指定的url发送GET请求,Requests会构造一个向服务器请求资源的Request对象。
  2. 当请求送达后,Requests库会接收到服务器返回的一个包含服务器资源的Response对象,这个Response对象就包含了从服务器返回的所有相关资源,包括请求状态,请求的HTML内容等等。

Response对象最常用的5个属性

属性说明
r.status_codeHTT请求的返回状态,200表示成功,400表示失败,其他状态值,请查看https://www.fdevops.com/2020/03/14/http-all-code
r.textHTTP响应内容的字符串形式,即URL对应的页面内容
r.encoding从HTTP header中猜测的相应内容编码方式
r.apparent_encoding从内容中分析出的相应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式

Requests库的方法介绍

requests.request(method, url, **kwargs)

requests.request() 参数 method的请求方式。

equests.request() 中的url参数就想说了,就是一个你需要爬取的链接地址。

requests.request() 中的**kwargs参数解析。

requests.get(url, params=None, **kwargs)

requests.head(url, **kwargs)

requests.post(url, data=None, json=None, **kwargs)

requests.put(url, data=None, **kwargs)

requests.patch(url, data=None, **kwargs)

requests.delete(url, **kwargs)

爬取网页的通用代码结构

在我们写爬虫程序的时候,需要按照一个的顺序去处理程序返回的Response对象属性,如下图所示:

Requests库的使用

通过实际的例子演示一下

通过上面的例子,可以看出如果编码不正确则无法正确的解析数据,而出现乱码的情况。

因为r.encoding是通过headers中的charset来得到的,如果headers中存在这个字段则是对应的编码格式,如果没有这个字段呢,则默认是ISO-8859-1,而这种编码格式是无法解析中文,因此会出现中文乱码。

r.apparent_encoding是根据返回的页面数据来获得的备用编码格式的,因此当出现返回乱码的时候,使用r.apparent_encoding替换掉r.encoding即可。

其实严格来说,r.apparent_encodingr.encoding得到的编码格式更加准确,因为r.apparent_encoding会去分析内容,而r.encoding不会,仅仅只是通过headerscharset而得到。

编码的简单介绍

  • ISO-8859-1 属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。很明显,ISO-8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。而且在很多协议上,默认使用该编码。
  • Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
  • UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

Requests中的常用异常

我们在爬取网页的过程中,肯定不会是一直一帆风顺的,会出现各种情况,比如已知网络链接异常,防火墙拦截等等,因此在开发爬虫程序的时候,对异常的处理也是非常重要的,需知道每种异常的处理方式。

Requests库支持的6中常用异常

异常说明
requests.ConnectionError网络连接错误异常,如DNS解析失败,拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常

Requests中的异常方法

通过一个实际的例子,演示一下:

可以把上面的实例看成一个爬虫代码的简单结构。

本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2020/08/26/python-requests
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注