requests库的使用
Requests库
requests库底层实现是有urllib
requests在python2和python3中通用
其作用是发送网络请求,返回响应数据
中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html
如何发送请求
response=requests.get(url)
-
生成一个请求需要哪些数据?
请求方式:get\post
请求的资源路径:url
协议版本:HTTP/1.1 (HTTP/2.0在1.1版本的基础上增加了并发请求)
请求参数
请求头
获取响应
-
response.content
如果得到bytes类型,则需要decode response.text
可以通过response.encoding()来指定解码方式-
响应对象中有什么?
响应状态码:response.status_code 200 500 404
响应消息头:response.headers set_cookie
响应消息正文:
response.text
response.content
发送的请求对象:
response.request
-
判断响应是否成功
assert response.status_code==200
response常用的方法
response.text
respones.content
response.status_code
response.request.headers
response.headers
response.text和response.content的区别
-
response.text
类型:str
解码类型:根据HTTP头部读相应的编码做出有根据的推测,推测文本编码
修改编码方式:
response.encoding="gbk"
-
response.content
类型:bytes
解码类型:没有指定
修改编码方式:
response.content.decode("utf-8")
发送带header的请求
带上请求头,可以模拟浏览器,欺骗服务器,从而获得和浏览器一致的内容
-
header的形式:字典
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"}
用法是:
requests.get(url,headers=headers)
发送带参数的请求
- 参数形式:字典
- 用法:`requests.get(url,headers=headers,parmas=dict)
发送post请求
在登录注册和传输大文本内容的时候用到post请求
-
用法
response = requests.post("http://www.baidu.com/", data = data,headers=headers)
data的形式:字典
用post请求百度翻译
import requests
import json
headers = {
"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"
}
query_string=input()
# query_string=sys.argv[1]
data = {
"query": query_string,
}
post_url = "http://fanyi.baidu.com/basetrans"
url="http://fanyi.baidu.com/langdetect"
response=requests.post(url,data=data,headers=headers)
ret=response.content.decode() # ret 是一个字符串对象
ret=json.loads(ret)
print(ret)
if ret["lan"]=='en':
# 输入是英文
data = {
"from": "en",
"to": "zh",
"query": query_string,
}
r = requests.post(post_url, data=data, headers=headers)
dict_ret = json.loads(r.content.decode())
ret = dict_ret["trans"][0]["dst"]
print(ret)
elif ret["lan"]=='zh':
# 输入是中文
data = {
"from": "zh",
"to": "en",
"query": query_string,
}
r = requests.post(post_url, data=data, headers=headers)
dict_ret = json.loads(r.content.decode())
ret = dict_ret["trans"][0]["dst"]
print(ret)
代理的应用
- 为什么使用代理
- 让服务器以为不是同一个客户端在请求
- 防止我们的真实地址被泄露,防止被追求
-
代理的使用
requests.get("http://www.baidu.com",proxies = proxies)
proxies形式:字典
proxies = { "http": "http://12.34.56.79:9527", "https": "https://12.34.56.79:9527", }
登录状态的保持
cookie和session的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
- session会在一定时间内保存在服务器上,如果访问增多,会占用较多的服务器资源
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
爬虫中处理cookie和session
-
带上cookie和session的好处
能够请求到登录之后的页面
-
带上cookie和session的弊端
一套cookie和session对应一个用户,如果请求太多,容易被服务器判定爬虫
cookie能不用则不用,如果为了获取登录之后的页面,必须发送带有cookie的请求
保持登录状态
-
requests模块提供了一个session类,来实现客户端和服务端的会话保持
- 方法:
实例化session对象
让session发送get或者post请求
session=requests.session() response=session.get(url,headers)
-
手动获取cookie,保存到文件或数据库中,在发送请求时,携带cookie
- 把cookie写到headers中
headers={"Cookie":cookie值}
- 使用参数将cookie字典传入
cookies={ "username":"xxxxx", "key":"value" } requests.get/post(url,cookies=cookies)
requests 其他
-
请求ssl证书验证
response= requests.get("https://www.12306.cn/mormhweb/ ", verify=False)
-
设置超时
response=requests.get(url,1)
-
配合状态码判断是否请求成功
assert 断言
assert response.status_code==200