安装
在命令行窗口进行下载
GET请求
- 最基本的get请求可以直接用get方法
response = request.get("http://www.baidu.com/")
response = requests.request("get", "http://www.baidu.com/")
- 添加头部headers和参数
- 如果想添加headers,可以传入headers参数来增加请求头中的headers信息
- 如果要将参数放在url中传递,可以利用
params
参数
访问百度并传参到搜索框
#访问百度网站并将参数传进去,相当于在百度搜索咸鱼
import requests
url = "http://www.baidu.com/s?"
kw = {"wd": "咸鱼"}
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"}
response = requests.get(url, params=kw, headers=headers)
# 查看响应内容,即网站源码。返回的是Unicode格式
print(response.text)
#查看响应内容,返回的是字节类型格式
print(response.content)
#查看完整url地址
print(response.url)
#查看响应头部字节编码
print(response.encoding)
#查看响应状态码
print(response.status_code)
--------------------------------------------------------------------------
......
......
'http://www.baidu.com/s?wd=%E9%95%BF%E5%9F%8E'
'utf-8'
200
- ps
使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。
使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件
POST请求
- post:将要处理的数据发送给服务器
response = requests.post("http://www.baidu.com/", data = data)
访问有道翻译
- 访问有道翻译并且翻译
- 当我们翻译时,查看源码的network字段,查看表单数据,可以发现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUcgflli-1622163185275)(C:\Users\26976\AppData\Roaming\Typora\typora-user-images\image-20210526195216696.png)]
import requests
form_data = {
"i": "i love you",
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"doctype": "json",
"keyfrom":"fanyi.web",
"ue": "UTF-8",
"typoResult": "true",
"action": "FY_BY_REALTIME"
}
url = "https://fanyi.youdao.com/"
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"}
response = requests.post(url, data=form_data, headers=headers)
content = response.text
print(response.text)
代理
- 如果需要使用代理,你可以通过为任意请求方法提供
proxies
参数来配置单个请求:
import requests
# 根据协议类型,选择不同的代理
proxies = {
"http": "http://12.34.56.79:9527",
"https": "http://12.34.56.79:9527",
}
response = requests.get("http://www.baidu.com", proxies = proxies)
print response.text
- 也可以通过本地环境变量
HTTP_PROXY
和HTTPS_PROXY
来配置代理:
export HTTP_PROXY="http://12.34.56.79:9527"
export HTTPS_PROXY="https://12.34.56.79:9527"
私密代理验证
import requests
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" }
response = requests.get("http://www.baidu.com", proxies = proxy)
print response.text
用户访问机制
- Web客户端验证,需要添加 auth = (账户名, 密码)
import requests auth=('test', '123456') response = requests.get('http://192.168.199.107', auth = auth) print response.text
Cookies 和 Session
Cookies
- 如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:
import requests response = requests.get("http://www.baidu.com/") # 返回CookieJar对象:cookiejar = response.cookies # 将CookieJar转为字典:cookiedict = requests.utils.dict_from_cookiejar(cookiejar) print cookiejar print cookiedict
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> {'BDORZ': '27315'}
Session
-
在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
-
会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。
-
实现人人网登陆
import requests# 创建一个session对象,保存cookie值session = requests.session()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"}# 用户名和密码data = {"email": "mr_mao_hacker@163.com", "password": "alarmchime"}# 发送用户名和密码的请求,并获取登录后的cookie值,保存在seesion里session.post("http://www.renren.com/PLogin.do", data=data)# session包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面response = session.get("http://www.renren.com/410043129/profile")print(response.text)
处理HTTPS请求 SSL证书验证
- Requests也可以为HTTPS请求验证SSL证书:
#要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)import requestsresponse = requests.get("https://www.baidu.com/", verify=True) # 也可以省略不写response = requests.get("https://www.baidu.com/")print response.text
- 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说 12306 证书是自己做的
import requestsresponse = requests.get("https://www.12306.cn/mormhweb/")print response.text
结果:
SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
- 改成这样就行了
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)