美文网首页
Python3爬虫神器Requests(一)——基础用法

Python3爬虫神器Requests(一)——基础用法

作者: 孤魂游 | 来源:发表于2018-02-21 23:08 被阅读580次

requests库是真的一个非常简单实用的库,可以说是一个完全给转基因的一个Python库,我们可以放心大胆的去使用它,我相信你一定会和我一样爱上他的简单粗暴。废话不多说我们来看看吧

首先当然是import requests

ta获取网页的方式也极其简单粗暴可以直接a = requests.get("https://www.baidu.com/")

没错就是这一条就可以了,那么我们现在有个名为a的Response对象(就是对于HTTP请求的一个响应)

如果你要post那么就可以reuqests.post其他的HTTP请求也是一样的

知道如何去get,post后我们来看看如何构造URL参数

如果是纯手工构建URl的话数据会以键/值的形式存在于URL中(跟在一个问号后面)就像这个一样http://fanyi.baidu.com/?aldtype=16047#zh/en/%E6%88%91

在requests这个非转基因的Python库中使用方法就显得有点简单粗暴了。你可以在requests中传入params关键字参数,这些关键字参数是以字符串字典的形式来传入的。我们来看个例子:

>>>payload = {"key1":"value1","key2":"value2"}

>>>r = requests.get("https://www.baidu.com/",params = payload)

>>>r.url

可以发现结果:'https://www.baidu.com/?key2=value2&key1=value1'

requests库这个结果自己帮我们构建好了url,我们简直不要太轻松。要注意的是字典里面值为None的键都不会被添加到url中,而且我们也可以将一个列表作为值传入

看了请求我们再来看看响应

requests可以自动解码来自服务器的内容大多数Unicode字符集都能被无缝解码。来看下面这段代码

>>>import requests

>>>a = requests.get("https://www.baidu.com/")

>>>a.text

这段代码可以得到百度源码。Requests会对响应头进行的编码进行推测,当使用.text获取内容的时候。你可以用a.encoding来查看它使用的什么编码也可以对a.encoding赋值来改变它的编码。如果你改变了编码,那么之后访问的都是改变之后的。

当然我们也可以以二进制的形式去访问返回文件a.content。Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。

Requests这么好用的神器当然也会自带json解码器咯。如果json解码失败了a.json就会抛出一个异常。但是我们要知道一点,即便是json解码成功了也不代表你响应成功,因为有些错误的信息中也会有json编码。

如果你确实想去访问一下服务器的原始套接字响应,那么可以用a.row去访问但是要注意,进行访问前要确认在请求的时候是否将stream的值设为True

有些时候我们需要模拟添加一个请求头,这个时候使用requests就很方便了,我们只需要将一个dict传给headers参数就好。不过要注意的是定制请求头的优先级低于某些信息源,也就是说,requests只是在最后将我们写的headers的信息传入进去,而不是会基于我们定制的headers来改变自己的行为。还有所有的 header 值必须是 string、bytestring 或者 unicode。

再来看看复杂一点的POST请求,如果我们要发送表单类型的数据格式该怎么办呢。requests这个非转基因的产品简单粗的只需要将那些要上传的信息作为一个字典传给data参数就好

>>> payload={'key1':'value1','key2':'value2'}

>>> r=requests.post("http://httpbin.org/post",data=payload)

就像这样。

当然也可以为data传入一个元组,尤其是有多个元素同时使用一个key的时候。当然如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。

requests的存在使得上传一个多部分编码的文件显得十分简单

>>> url='http://httpbin.org/post'

>>> files={'file':open('report.xls','rb')}

>>> r=requests.post(url,files=files)

最好使用二进制模式打开文件,这是因为requests会试图为你提供Content-Length header,如果这么做的话,这个值将会是文件的字节数,如果使用文本模式打开文件那么就可能发生错误

我们可以用a.status_code来获取状态码,当然也可以用它的一个内置的状态码查询对象requests.codes.ok

如果出现了错误的请求(4xx或者5xx)那么可以用a. raise_for_status()来抛出异常。不过如果获取成功了后调用这个的话得到的是None

我们可以用a.headers的方法来查看响应头,HTTP响应头是大小写不敏感的

在requests中你可以轻松地获取和传递cookie如果某些响应包含cookie那么你可以用a.cookies["key"]来获得value,如果想要发送cookies那么可以将要传入的信息作为dict传入到cookies参数。Cookie 的返回对象为 RequestsCookiesJar,它的行为和字典类似,但界面更为完整,适合跨域名跨路径使用。

除了HEAD和Requests会自动处理重定向以外我们还可以用history方法来追踪重定向a.history是一个Response 对象的列表,这个对象列表按照从最老到最近的请求进行排序。当然也可以通过 allow_redirects 参数禁用重定向处理

我们还可以设置timeout听名字就知道这是用来超时限制的,其参数就是多少时间后停止等待响应,timeout仅对连接过程有效,是在请求的时候发生的。

最后来说说一些错误和异常

遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。

如果 HTTP 请求返回了不成功的状态码,Response.raise_for_status() 会抛出一个 HTTPError 异常。

若请求超时,则抛出一个 Timeout 异常。

若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。

所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

相关文章

网友评论

      本文标题:Python3爬虫神器Requests(一)——基础用法

      本文链接:https://www.haomeiwen.com/subject/wykotftx.html