Python版本:Python 3.X
Requests库官方文档:https://pypi.python.org/pypi/requests
Introduction
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库。如果你看过 Python爬虫(2) 关于urllib库的使用,你会发现,其实urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。
默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装。但是国内使用pip容易撞墙,推荐下载requests轮子。这里有个http://www.lfd.uci.edu/~gohlke/pythonlibs网站里面有各种各样的轮子,ctrl+f找到requests后,下载zip格式的轮子,解压后把requests文件夹放到Python的lib文件夹里就可以了。这时运行import requests,有可能提示你没这个库没那个库的,这时因为requests库还用到了其他的库,同样从那个网站里找到相应的库依次放到lib文件夹里就好。
总体演示
import requests
response = requests.get("https://www.baidu.com")
print(type(response))
print(response.status_code)
print(type(response.text))
print(response.text)
print(response.cookies)
print(response.content)
print(response.content.decode("utf-8"))
很多情况下网站的response.text会出现乱码,所以用response.content,这返回的是二进制格式,用decode('utf-8')转换。
各种请求方式
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")
GET请求
get请求可以不带参数只有URL,也可以携带params为data的参数。如果我们想要在URL查询字符串传递数据,通常我们会通过httpbin.org/get?key=val方式传递。Requests模块允许使用params关键字传递参数,以一个字典来传递这些参数,例子如下:
import requests
data = {
"name":"zhaofan",
"age":22
}
response = requests.get("http://httpbin.org/get",params=data)
print(response.url)
print(response.text)
解析json
import requests
import json
response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(json.loads(response.text))
print(type(response.json()))
从结果可以看出requests里面集成的json其实就是执行了json.loads()方法,两者的结果是一样的。
添加headers
和前面我们将urllib模块的时候一样,我们同样可以定制headers的信息,如当我们直接通过requests请求知乎网站的时候,默认是无法访问的。因为访问知乎需要头部信息,这个时候我们在谷歌浏览器里输入chrome://version,就可以看到用户代理,将用户代理添加到头部信息:
这样子就可以正常访问了:
import requests
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
response =requests.get("https://www.zhihu.com",headers=headers)
print(response.text)
POST请求
通过在发送post请求时添加一个data参数,这个data参数可以通过字典构造成,这样对于发送post请求就非常方便。
import requests
data = {
"name":"jamesqiu",
"age":19
}
response = requests.post("http://httpbin.org/post",data=data)
print(response.text)
响应
import requests
response= requests.get("
if response.status_code == requests.codes.ok:
print("Access Successfully!")
requests的高级用法
文件上传
import requests
files= {"files":open("git.jpeg","rb")}
response = requests.post("url", files=files)
print(response.text)
获取cookie
response = requests.get("http://www.baidu.com")
print(response.cookies)
for key,value in response.cookies.items():
print(key+"="+value)
Cookie的一个作用就是会话维持:
import requests
s = requests.Session()
s.get("http://httpbin.org/cookies/set/number/123456")
response = s.get("http://httpbin.org/cookies")
print(response.text)
证书验证
现在的很多网站都是https的方式访问,所以这个时候就涉及到证书的问题。解决方法为:
import requestsfrom requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get("
print(response.status_code)
这样就不会提示警告信息,当然也可以通过cert参数放入证书路径。
代理设置
proxies= {
"http":"http://127.0.0.1:9999",
"https":"http://127.0.0.1:8888"
}
response = requests.get("https://www.baidu.com",proxies=proxies)
print(response.text)
如果代理需要密码,则
proxies ={"http":"http://user:password@127.0.0.1:9999"}
其他
另外还有设置timeout参数,认证设置(有的网站需要认证,可以通过requests.auth模块实现:参数auth=HTTPBasicAuth),异常处理等。