09_requests(一)之基本用法

1. 实例引入

urllib库中的urlopen()方法其实是以GET方式请求网页,而requests中相应的方法就是get()方法,是否是感受表达更明确一些?下面经过实例来看一下:html

运行结果以下:python

这里咱们调用get()方法实现与urlopen()相同的操做,获得一个Response对象,而后分别输出了Response的类型、状态码、响应体的类型、内容以及Cookies。nginx

经过运行结果能够发现,它的返回类型是requests.models.Response,响应体的类型是字符串str,Cookies的类型是RequestsCookieJargit

使用get()方法成功实现一个GET请求,这倒不算什么,更方便之处在于其余的请求类型依然能够用一句话来完成,示例以下:程序员

这里分别用post()put()delete()等方法实现了POST、PUT、DELETE等请求。是否是比urllib简单太多了?github

其实这只是冰山一角,更多的还在后面。正则表达式

3. GET请求

HTTP中最多见的请求之一就是GET请求,下面首先来详细了解一下利用requests构建GET请求的方法。json

基本实例

首先,构建一个最简单的GET请求,请求的连接为http://httpbin.org/get,该网站会判断若是客户端发起的是GET请求的话,它返回相应的请求信息:windows

运行结果以下:浏览器

能够发现,咱们成功发起了GET请求,返回结果中包含请求头、URL、IP等信息。

那么,对于GET请求,若是要附加额外的信息,通常怎样添加呢?好比如今想添加两个参数,其中namegermeyage是22。要构造这个请求连接,是否是要直接写成:

这样也能够,可是是否是有点不人性化呢?通常状况下,这种信息数据会用字典来存储。那么,怎样来构造这个连接呢?

这一样很简单,利用params这个参数就行了,示例以下:

运行结果以下:

经过运行结果能够判断,请求的连接自动被构形成了:http://httpbin.org/get?age=22&name=germey

另外,网页的返回类型其实是str类型,可是它很特殊,是JSON格式的。因此,若是想直接解析返回结果,获得一个字典格式的话,能够直接调用json()方法。示例以下:

运行结果以下:

能够发现,调用json()方法,就能够将返回结果是JSON格式的字符串转化为字典。

但须要注意的书,若是返回结果不是JSON格式,便会出现解析错误,抛出json.decoder.JSONDecodeError异常。

抓取网页

上面的请求连接返回的是JSON形式的字符串,那么若是请求普通的网页,则确定能得到相应的内容了。下面以“知乎”→“发现”页面为例来看一下:

这里咱们加入了headers信息,其中包含了User-Agent字段信息,也就是浏览器标识信息。若是不加这个,知乎会禁止抓取。

接下来咱们用到了最基础的正则表达式来匹配出全部的问题内容。关于正则表达式的相关内容,咱们会在3.3节中详细介绍,这里做为实例来配合讲解。

运行结果以下:

咱们发现,这里成功提取出了全部的问题内容。

抓取二进制数据

在上面的例子中,咱们抓取的是知乎的一个页面,实际上它返回的是一个HTML文档。若是想抓去图片、音频、视频等文件,应该怎么办呢?

图片、音频、视频这些文件本质上都是由二进制码组成的,因为有特定的保存格式和对应的解析方式,咱们才能够看到这些形形色色的多媒体。因此,想要抓取它们,就要拿到它们的二进制码。

下面以GitHub的站点图标为例来看一下:

这里抓取的内容是站点图标,也就是在浏览器每个标签上显示的小图标,如图3-3所示。

图3-3 站点图标

这里打印了Response对象的两个属性,一个是text,另外一个是content

运行结果如图3-4所示,其中前两行是r.text的结果,最后一行是r.content的结果。

图3-4 运行结果

能够注意到,前者出现了乱码,后者结果前带有一个b,这表明是bytes类型的数据。因为图片是二进制数据,因此前者在打印时转化为str类型,也就是图片直接转化为字符串,这理所固然会出现乱码。

接着,咱们将刚才提取到的图片保存下来:

这里用了open()方法,它的第一个参数是文件名称,第二个参数表明以二进制写的形式打开,能够向文件里写入二进制数据。

运行结束以后,能够发如今文件夹中出现了名为favicon.ico的图标,如图3-5所示。

图3-5 图标

一样地,音频和视频文件也能够用这种方法获取。

添加headers

urllib.request同样,咱们也能够经过headers参数来传递头信息。

好比,在上面“知乎”的例子中,若是不传递headers,就不能正常请求:

运行结果以下:

但若是加上headers并加上User-Agent信息,那就没问题了:

固然,咱们能够在headers这个参数中任意添加其余的字段信息。

4. POST请求

前面咱们了解了最基本的GET请求,另一种比较常见的请求方式是POST。使用requests实现POST请求一样很是简单,示例以下:

这里仍是请求http://httpbin.org/post,该网站能够判断若是请求是POST方式,就把相关请求信息返回。

运行结果以下:

能够发现,咱们成功得到了返回结果,其中form部分就是提交的数据,这就证实POST请求成功发送了。

5. 响应

发送请求后,获得的天然就是响应。在上面的实例中,咱们使用textcontent获取了响应的内容。此外,还有不少属性和方法能够用来获取其余信息,好比状态码、响应头、Cookies等。示例以下:

这里分别打印输出status_code属性获得状态码,输出headers属性获得响应头,输出cookies属性获得Cookies,输出url属性获得URL,输出history属性获得请求历史。

运行结果以下:

由于session_id过长,在此简写。能够看到,headerscookies这两个属性获得的结果分别是CaseInsensitiveDictRequestsCookieJar类型。

状态码经常使用来判断请求是否成功,而requests还提供了一个内置的状态码查询对象requests.codes,示例以下:

这里经过比较返回码和内置的成功的返回码,来保证请求获得了正常响应,输出成功请求的消息,不然程序终止,这里咱们用requests.codes.ok获得的是成功的状态码200。

那么,确定不能只有ok这个条件码。下面列出了返回码和相应的查询条件:

好比,若是想判断结果是否是404状态,能够用requests.codes.not_found来比对。

转载于:静觅 » [Python3网络爬虫开发实战] 3.2.1-基本用法

相关文章
相关标签/搜索