Requests使用

本文介绍号称是最适合人类使用的库:Requests库。
这个库的底层就是用urllib3实现的。继承了urllib2所有的特性,支持HTTP连接保持和连接池,支持cookie保持会话,支持POST数据自动编码。

安装

安装部分省略,自行谷歌。

基本的GET请求

headers参数和parmas参数

上代码:

# coding=utf8
import requests

# 此处是url中包含的参数
kw = {'wd': 'python'}

# 自行添加浏览器头uesr-agent
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/54.0.2840.99 Safari/537.36"}

url = 'http://www.baidu.com/s?'

# 将参数传递给get方法中,parmas是关键字,headers是浏览器头
response = requests.get(url, params=kw, headers=headers)

# 直接写到文件中
# with open('bai.txt', 'wb') as f:
#     f.write(response.content)


print(response.status_code) # 返回状态码 ,例如 200
print(response.encoding) # 返回响应头部字符编码, 例如utf-8
print(response.url)    # 返回完整的URL地址  

# content返回的是字节流数据,当写到文件中的时候要用‘wb’
print(response.content)    

# text方法返回的是unicode数据
print(response.text)

使用requests发送Get请求,很简单,直接构造一个请求数据就行。
url中wd后面是要查询的关键字。


基本的POST请求

在发送post请求时候,必须带上一个data参数
以下是以有道翻译网页为例,上代码:

# coding=utf8

import requests

 # 字典的构造必须要抓包才能知道到底是需要哪些数据
 # 实际有些字段是不变的,多注意就能发现需要哪些
data = {
    "type": "AUTO",
    "i": "hello, tom",
    "doctype": "json",
    "xmlVersion": "1.8",
    "keyfrom": "fanyi.web",
    "ue": "UTF-8",
    "action": "FY_BY_ENTER",
    "typoResult": "true"
}


# url地址也是需要抓包才能知道要请求的地址是哪里
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"


headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

# 发送post请求直接调用post方法即可
response = requests.post(url, data=data, headers=headers)


# text方法返回的是unicode数据
print(response.text)

# 如果返回json数据格式,则使用json方法会直接显示为json格式
print(requests.json())

代理参数 Proxies

使用配置代理参数时,添加proxies参数即可:

import requests

# 根据协议类型,选择不同的代理
proxies = {
  "http": "http://121.343.26.29:9999",
  "https": "http://122.341.563.44:9999",
}

response = requests.get("http://www.baidu.com", proxies = proxies)
print response.text

只是多了一个proxies参数而已,其余没区别,只是在写ip时要有ip地址和端口号。

私密代理(特定格式)

使用私密代理的时候是需要提供该网站的账号以及密码的,所以,就需要使用特定的格式:

proxy = { "http": "账户名字:密码@所用的代理IP地址:端口号" }

上代码:

import requests

# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxy = { "http": "账户名字:密码@所用的代理IP地址:端口号" }

response = requests.get("http://www.baidu.com", proxies = proxy)

print response.text

在代码上是没有去别的,同样使用的是proxies参数接受。

web客户端验证(auth参数)

当需要进行web客户端验证,添加auth参数即可:

import requests

auth=('test', '123456')

response = requests.get('http://192.168.199.107', auth = auth)

print response.text

同样使用auth参数接受。

在以上的二部分内容,如果是使用urllib2实现,是一个很麻烦的过程。so, requests库确实是一个很方便使用的库。

使用cookie参数直接就可以取到响应中包含的cookie:

import requests

response = requests.get("http://www.baidu.com/")

# 返回CookieJar对象:
cookiejar = response.cookies

# 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)

# 返回的是cookie对象
print cookiejar

# 返回的会死字典格式的cookie值
print cookiedict  

Session

session在模拟登陆的时候非常有用的方法。在一些需要登录才能看到的页面,session显得很好用。

import requests

# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()

# 2. 处理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 3. 需要登录的用户名和密码
data = {"登陆用户名的字段":"登陆的用户名", "登陆密码字段":"登陆密码"}  

# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)

# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")

# 6. 打印响应内容
print response.text

实际上这么简单的只用session验证登陆的网站并不是很多,很多的网址都是还附加了其他的验证机制。只能通过抓包查看。

处理HTTPS请求 SSL证书验证

对于https网页,要验证ssl证书时候,添加verify=True参数即可:

import requests
response = requests.get("https://www.baidu.com/", verify=True)

一般的证书都是没问题的,但是对于12306网站,它是自己做的证书,要跳过这个ssl验证,将verify=False即可。否则会报SSLError错误。