摘要
Request是一个简答优雅的python HTTP库,相较于python标准库中的urllib和urllib2的库,Requests更加的便于理解使用。
- request库基于urllib,比urllib更加方便,是Python更加简单的http库。
 
- 使用request库的一个例子:
 
import requests response = requests.get('http://www.baidu.com') print(type(response))#返回值的类型 print(response.status_code)#当前网站返回的状态码 print(type(response.text))#网页内容的类型 print(response.text)#网页的具体内容(html代码) print(response.cookies)#网页的cookie
   | 
 
具体解释写在了注释里面,request中输出网页的html代码的方法是response.text方法,它相当于urllib库的response.read方法,只不过不需要进行decode操作。
打印cookie的操作也比urllib简单,只需要使用.cookie方法即可。
执行结果如下:

import requests
  requests.post('http://httpbin.org/post') requests.delete('http://httpbin.org/delete') requests.put('http://httpbin.org/put') requests.head('http://httpbin.org/get') requests.options('http://httpbin.org/get')
   | 
 
这里的请求返回值可以去http://httpbin.org获取,这个网站可以用来进行http请求的测试。
 GET请求
import requests response = requests.get('http://httpbin.org/get') print(response.text)
   | 
 
这是request中最简单的get请求。
import requests response = requests.get('http://httpbin.org/get?name=germey&age=22') print(response.text)
   | 
 
其中http://httpbin.org/get后面的部分为get方法的基本构成,不清楚的可以去了解一下,以上代码会返回get请求参数。
如果不想构造url,那么requeat库中有一个params参数,可以传入一个字典,他会给你自动拼接到url后面,例子如下:
import requests data = {     'name':'germey',     'age':'22' } response = requests.get('http://httpbin.org/get',params=data) print(response.text)
   | 
 
这样就能构造一个get请求参数,和上面返回的内容相同。
 import requests import json response = requests.get('http://httpbin.org/get') print(type(response.text)) print(response.json()) print(json.loads(response.text)) print(response.text) print(type(response.json()))
 
  | 
 
response.json()与json.loads ()返回的结果完全相同,在使用ajax请求时比较常用。
- 获取二进制数据
在下载图片或者视频时,常用的方法,获取图片或者视频的二进制数据。 
import requests
  response = requests.get("https://github.com/favicon.ico") print(type(response.text),type(response.content)) print(response.text) print(response.content)
   | 
 
这里打印出了当前网址图片的二进制数据
也可以用以下方法之间把图片下载下来,保存成图片属性:
import requests
  response = requests.get("https://github.com/favicon.ico") with open('facicon.ico','wb') as f:     f.write(response.content)     f.close()
   | 
 
- 添加headers
在写爬虫时,如果不加header参数,当前网站就会把你当成爬虫,然后禁止你访问,加入headers可以有效的避免。 
import requests url = 'https://www.zhihu.com/explore' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Host':'httpbin.org' } response = requests.get(url,headers) print(response.text)
   | 
 
User-Agent的参数时浏览器信息,加上headers能让服务器认为你是浏览器访问的而不是爬虫访问的,实现了浏览器的伪装。
 POST请求
import requests data = {     'name':'germey',     'age':'22' } headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Host':'httpbin.org' } url = 'http://httpbin.org/post' response = requests.post(url,data,headers) print(response.json())
   | 
 
POST请求和GET请求的区别就是,需要穿入一个form表单,使用request库可以将表单构造成字典类型,之后传入。
- 其他的POST方法个GET方法相同,只需要将request.get换成request.post即可
 
 响应
import requests
  response = requests.get('http://www.jianshu.com') print(type(response.status_code), response.status_code) print(type(response.headers), response.headers) print(type(response.cookies), response.cookies) print(type(response.url), response.url) print(type(response.history), response.history)
   | 
 
这些是常用的response返回结果。
import requests response = requests.get('http://www.jianshu.com') exit()if not response.status_code ==requests.codes.ok else print('成功访问')
   | 
 
这里使用requests.codes.ok可以用名字调用相应的状态码。
这里还有其他状态码对应的名字:



 高级操作
 import requests
  file = {     'file':open('文件名称','rb') } response = requests.post("网址",file) print(response.text)
 
  | 
 
在文件名称处写入要穿入文件的目录。
 import requests response = requests.get('https://www.baidu.com') print(response.cookies) for key,value in response.cookies.items():     print(key+"="+value)
 
  | 
 
可以将cookie使用key  value的形式打印出来
- 会话维持
获取到cookie后,就可以进行模拟登陆操作了 
 import requests s = requests.Session() s.get('http://httpbin.org/cookies/set/number/123456789') response = s.get('http://httpbin.org/cookies') print(response.text)
 
  | 
 
输出结果为:

这里我们使用session保存了当前的cookie,让服务器认为是一台浏览器发起的请求,就可以成功打印出cookie。
- 如果要模型登录验证时,就可以使用requests.Session()来发起请求,他可以模拟浏览器对服务器进行请求,维持了登录会话
 
- 证书验证
如果访问用request请求访问https协议的网站时,他会首先检测证书是否合法,如果检测不合法,就会抛出错误。
如果想要避免错误,只需要把request中的verify设置为false,就可以了。 
 import requests response = requests.get('https://www.12306.cn',verify = False) print(response.status_code)
 
  | 
 
会返回200,表示正常连接。
import requests proxys = ({     'http':'http://127.0.0.1',     'https':'https://127.0.0.1' })
  response = requests.get('http://www.baidu.com',proxys) print(response.status_code)
   | 
 
注意:proxys中的参数是你自己代理的ip地址,需要修改
 import requests
  response = requests.get('http://www.baidu.com',timeout =1) print(response.status_code)
 
  | 
 
使用timeout参数设置超时时间,如果访问网站时超过这个时间,则会报错。
我们可以加一个try -except来捕获异常
import requests from requests.exceptions import ReadTimeout try:     response = requests.get('http://www.baidu.com',timeout =1)     print(response.status_code) except ReadTimeout:     print('Timeout')
   | 
 
- 认证设置
有些网站登录时需要验证用户名和密码,比如

 
如果遇到这种网站,则可以使用如下方法完成正常请求:
import requests
  from requests.auth import HTTPBasicAuth
  response = requests.get('需要访问的网址',auth = HTTPBasicAuth('用户名','密码')) print(response.status_code)
 
   | 
 
Python3的request库比起urllib库更加方便好用,在写爬虫时会经常用到