1.requests简介
Requests是一个优雅而简单的Python HTTP库,专为人类而构建,requests的使用方式非常的简单、直观、人性化,让程序员的精力完全从库的使用中解放出来。
Requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档:http://cn.python-requests.org/zh_CN/latest/。 英文文档:http://docs.python-requests.org/en/master/api/
首先打开requests库的源码
def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None)
Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,使用Requests构造的方法,并在其中传入需要的参数即可。每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法,而其他的请求类型,都有各自对应的方法:
import requests req1 = requests.get("https://www.baidu.com") req2 = requests.post("https://www.baidu.com") req3 = requests.put("https://www.baidu.com") req4 = requests.delete("https://www.baidu.com")
2.发送请求和传入参数
我们可以直接往传入headers,我们以简书网为例:
# 自定义headers headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" } # 自定义cookies cookies = { "cookie": "sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216e2b34f5c5357-040290e0015209-7373e61-1049088-16e2b34f5c6470%22%2C%22%24device_id%22%3A%2216e2b34f5c5357-040290e0015209-7373e61-1049088-16e2b34f5c6470%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; __yadk_uid=Xtd0BZTUL8a4fZOfayVfSgHUbAlRlIyC; signin_redirect=https%3A%2F%2Fwww.jianshu.com%2F; read_mode=day; default_font=font2; locale=zh-CN; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1572683291,1572878893,1572910084,1573038354; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1573038354" } # 对简书网发送请求 req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies)
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。
req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies,allow_director=False)
当我们需要使用代理时,同样构造代理字典,传递给proxies参数,自定义proxies参数,porxies = {"http":"id:port"}
3.接受响应
通过Requests发起请求获取到的是request对象,我们可以通过text直接读取到字符串格式的响应内容,或用content获取原始的二进制数据。Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。如下:
import requests
# 对简书网发送请求 req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies) # text读取内容 req.encoding = "utf-8" res = req.text print(res)
或者用content方法获取二进制数据
# content读取响应内容 res = req.content.decode() print(res)
除了查看响应内容之外,我们还可以单独地查看请求头中的headers,encoding,url,status code等
res_code = req.status_code res_encoding = req.encoding res_header = req.headers["Connection"] res_headers = req.headers res_url = req.url print(res_code) print(res_encoding) print(res_headers) print(res_url)
4.session对象
在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。 这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递cookies。
首先我们需要去生成一个Session对象,然后用这个Session对象来发起访问,发起访问的方法与正常的请求是一摸一样的。
session = requests.session() req = session.get("http://www.baidu.com") req.encoding = "utf-8" res = req.text print(res)
同时,需要注意的是,如果是我们在get()方法中传入headers和cookies等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个headers在Session的整个生命周期内都有效的话,需要用以下的方式来进行设置:
# 实例一个对象 session = requests.session() # 设置整个headers session.headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" } # 增加一条header session.headers.update({"x-test":"true"}) req = session.get("http://www.jianshu.com",headers=session.headers) req.encoding = "utf-8" res = req.text print(res)