本文介绍号称是最适合人类使用的库: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参数直接就可以取到响应中包含的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错误。