- 概述:
requests框架基于urllib封装的一个请求框架,、几乎包含urllib所有的请求功能,在其基础上进行了深度的拓展 安装requests
pip install requests
requests的响应类
res = requests.get(url) #res即为resquests的响应类
属性 说明 encoding requests从响应的header自动猜测出响应页面编码方式,该值默认为ISO-8859-1 apparent_encoding requests从响应页面猜测响应页面编码方式 url 响应的url status_code 响应的http状态码 cookies 响应的cookies elapsed 发送请求到收到响应消耗的时间 headers 响应的headers history 请求历史 headers 响应的headers content 页面源码,二进制的页面源码 text 也是页面源码,unicode,requests自动解码,返回str源码 请求方法:
- requests.get(url, params=None, **kwargs) params={'':''}
- requests.post(url, data=None, json=None, **kwargs) data = {'':''}
- requests.head(url, **kwargs)
- requests.put(url, data=None, **kwargs)
- requests.patch(url, data=None, **kwargs)
- requests.delete(url, **kwargs)
- requests.request(method, url, **kwargs)
以上就是requests全部的访问方法,并且全部都返回Request对象
- 请求参数**kwargs
参数 | 说明 |
---|---|
params | 自动构建url,get请求时使用 |
data | 提交表单,post请求时使用 |
headers | 请求headers |
cookies | 请求cookies |
timeout | 超时时间 |
proxies | ip代理 |
json | 发送json |
file | 发送文件(Multipart-Encoded) |
allow_redirects | |
auth | |
verify | |
stream | |
cert |
- 实例1:
import requests
# requests本身就是一个请求对象
res = requests.get("http://www.baidu.com/")
print(res) #<Response [200]>
url = "https://www.baidu.com/s?"
# 加请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
# 创建参数
data = {
"wd":"日本美女"
}
# 用requests对象发起请求
res = requests.get(url=url,headers=headers,params=data)
# res是响应对象,包含响应头和响应体
# print(res.text) # 用字符串的格式提取出响应体
print(res.content)
print(res.headers)
# requests也不能解析js
- 实例2:古诗文登录
import requests
from lxml import etree
# 登录
# post请求 账户密码 两个token值 验证码
# 用登录页把验证码和token值获取出来
login_url = "https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m'
}
# 访问登录页
# login_html = requests.get(url=login_url,headers=headers) # requests无法保存cookie
s = requests.Session() # requests框架中会话信息用Session对象来保存
login_html = s.get(url=login_url,headers=headers)
# 解析出来验证码和token
html_tree = etree.HTML(login_html.text)
# 提取两个token值
a = html_tree.xpath("//input[@id='__VIEWSTATE']/@value")[0]
b = html_tree.xpath("//input[@id='__VIEWSTATEGENERATOR']/@value")[0]
print(a,b)
# 提取验证码
img_url = "https://so.gushiwen.org" + html_tree.xpath("//img[@id='imgCode']/@src")[0]
img = s.get(img_url)
with open("./yanzhengma.png","wb") as fp:
fp.write(img.content)
# 验证码处理、人工智能识别、人工手动输入
code = input("请输入验证码:")
print(code)
# 登录
post_url = "https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx%3ftype%3dm "
data = {
'__VIEWSTATE': a,
'__VIEWSTATEGENERATOR':b,
'from':'http://so.gushiwen.org/user/collect.aspx?type=m',
'email':'fanjianbo666@163.com',
'pwd':'123456',
'code': code,
'denglu':'登录'
}
res = s.post(url=post_url,headers=headers,data=data)
print(res.text)
- 实例3:ChinaUnix登录
import requests
from bs4 import BeautifulSoup
# 设置代理服务器列表
proxies = {"https":"122.4.29.15:27074"}
s = requests.Session()
login_page = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes"
# 加请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
# 反爬:用户名和密码 设置隐藏域 post接口中某些参数是动态生成
# 请求登录页
# r = s.get(url=login_page,headers=headers,proxies=proxies)
r = s.get(url=login_page,headers=headers)
soup = BeautifulSoup(r.text,'lxml')
# 动态post接口
login_params = soup.select("form.cl")[0].attrs.get("action")
print(login_params)
# 解决formhash的动态生成
formhash = soup.select("[name=formhash]")[0].attrs.get("value")
print(formhash)
# 构造请求体
data = {
'formhash': formhash,
'referer':'http://bbs.chinaunix.net/',
'username':'MrFan666',
'password':'f12345678',
'loginsubmit':'true',
'return_type':''
}
# 登录接口
login_url = "http://bbs.chinaunix.net/" + login_params
# 发起post请求登录
res = s.post(url=login_url,headers=headers,data=data)
print(res.text)
评论 (0)