Requests库基础

之前写爬虫更多的是使用urllib和urllib2这两个库,但是比起Requests库来讲,urllib和urllib2不管在性能上,还是在功能上都不如Requests库。为了更好的写爬虫,所以学习使用Requests是必不可少的。在这里介绍一下Requests库的基础用法。
这里,我们先看一下下面这段简短的代码:

import requests
r = requests.get('http://www.baidu.com')
print type(r)
print r.status_code

打印结果为:

<class 'requests.models.Response'>
200

上面为调用get方法后的返回值类型,下面为HTTP状态码,200表示成功。至于其他状态码为多少,这里就不再赘述。

requests提供了http所有的基础请求方式:

r = requests.post("http://www.baidu.com/post")
r = requests.put("http://www.baidu.com/put")
r = requests.delete("http://www.baidu.com/delete")
r = requests.head("http://www.baidu.com/get")
r = requests.options("http://www.baidu.com/get")

基本的get请求:
get方法是默认的HTTP请求方法,我们日常用get方法来提交表单数据,然而用get方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如
Http://www.baidu.com/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的URL请求中,很容易就可以辩认出表单提交的内容(?之后的内容)另外由于get方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。

那么,当我们需要使用get方法提交申请的时候,如何包装数据呢?
在requests的get函数中,可以提交第二个参数,这个参数是要需要提交参数的一个字典:

paramsdic = {'key1':value1,'key2':value2}
r = requests.get(url,params=paramsdic)

这样就使用带参数的get提交方法,运行结果大致会这样:

http://www.baidu.com/get?key2=value2&key1=value1

如果我们想添加headers,可以在第三个参数中传入headers

import requests
paramsdic = {'key1': 'value1', 'key2': 'value2'}
headers = {'content-type': 'application/json'}
r = requests.get("http://www.baidu.com/get", params=paramsdic, headers=headers)

在获取结果以后,我们可以用一下方法得到自己想要的结果:

r.text     #直接过去响应内容
r.json()   #解析json()文件

r = request.get(url,stream=True)
r.raw      #获取来自服务器的原始套接字响应

基本post请求:
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。
当我们需要添加参数的时候,可以利用data参数传递:

import requests
datadic={'key1': 'value1', 'key2': 'value2'}
r=requests.post(url,data=datadic)

这里我们使用httpbin.org作为用例url,得到结果为:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.3.0 CPython/2.7.6 Windows/8"
  }, 
  "json": null, 
  "origin": "113.251.162.26", 
  "url": "http://httpbin.org/post"
}

可以看到我们将值提交到了表单。参数传递成功。但是,有时候我们传递的信息不是表单形式,需要传递JSON格式的数据过去。这时候我们可以使用json.dumps()方法把表单序列化:

import json
import requests
url = 'http://httpbin.org/post'
datadic = {'some':'data'}
r = requests.post(url,data=json.dumps(datadic))
print r.text

得到结果:

{
  "args": {}, 
  "data": "{\"key2\": \"value2\", \"key1\": \"value1\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "36", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.3.0 CPython/2.7.6 Windows/8"
  }, 
  "json": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "origin": "113.251.162.26", 
  "url": "http://httpbin.org/post"
}

可以看到,返回的数据中,和之前表单形式有所不同,这里将数据放到json当中。
还有一种提交方式,是直接上传文件,只需要构造一个files字典,而后将files参数传递进去。
Cookies
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
这是获取:

import requests
r = request.get(url)
print r.cookies

这是提交:

import requests
cookies=dict(cookies_are='working')
r=request.get(url,cookies=cookies)
print r.text
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值