requests模块
requests模块
这个是第三方模块,需要安装
安装
pip install requests
http的8种请求方式:get,post,put,delete,option,trace,connect,head,
主要就是get和post,
request源码分析
requests源码解析,
import requests
requests.get(url,)
# 里面除了url参数还有什么参数?
#看源码,这个get请求是取调用了request,
def get(url, params=None, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
# 然后request最后是返回了session.request()
def request(method, url, **kwargs):
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)
# 而session.request()里面有很多的参数,
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): XXX
# 参数解释
# data 这是携带请求体里面的数据,字典格式,
# headers 这是携带请求头,字典格式,
# cookies 这是携带请求的cookies信息,字典格式,
# proxies 这个是使用代理,也是字典格式,
# verify 如果是https请求,把这个=FALSE,就是不校验证书,
分析response响应数据
import requests
res = requests.get(url)
print(dir(res))
#通过这个dir查看一下这个返回值,有什么方法?
[ 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding',
'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json',
'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
#去掉双下划线的方法,解释一下这些方法,
# content,返回一个二进制的响应内容,
# cookies,打印出cookies信息,
# encoding,打印出编码类型
# headers,打印出headers信息,
# status_code,打印状态码
# text,打印出编码后的响应内容
# url,打印出本次请求的url,
python-使用字典推导式把cookie从字符串转换成字典
cookies = "vaptchaNetway=cn; Hm_lvt_337e99a01a907a08d00bed4a1a52e35d=1628248083,1629106799; " \
"sessionid=g1siko0evn5hmnn3pbgl0vaoqjx29cfo; Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d=1629124377"
# 不使用字典推导式的写法
cookie_list = cookies.split(";")
cookie_dict = {}
print(cookie_list)
for cookie in cookie_list:
cookie_dict[cookie.split("=")[0].strip()] = cookie.split("=")[1].strip()
print(cookie_dict)
# 使用字典推导式的写法
print({cookie.split("=")[0].strip():cookie.split("=")[1].strip()for cookie in cookies.split(";")})
切url的末尾字符串
url = "http://n.sinaimg.cn/news/1_img/upload/cf3881ab/67/w1000h667/20200710/1349-iwasyei8902095.jpg"
# 三种办法 切到----1349-iwasyei8902095.jpg
print(url.split("/")[len(url.split("/"))-1]) # 取值列表的最后一个元素
print(url.split("/")[-1]) # 取值列表的最后一个元素
print(url.rsplit("/",1)[1]) # 这个就是从右侧分隔字符串,分隔一次,所以要取第二个,
requests报错解决
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.kuaidaili.com', port=443): Max retries exceeded with url: /free/inha/2/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)')))
解决方法:
requests.get(url.format(i), headers=headers, cookies=cookie_dict, verify=False)
重点是增加 verify=False
可能会有一个警告,
增加2行代码,去掉警告,
import urllib3
urllib3.disable_warnings()
固定header头顺序
在使用 requests 发送 post 请求时保持 headers 的顺序不变
import requests
url = "xxx"
headers = {
"Host": "match.yuanrenxue.com",
"Connection": "keep-alive",
"Content-Length": "0",
"Origin": "http://match.yuanrenxue.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
"Accept": "*/*",
"Referer": "http://match.yuanrenxue.com/match/3",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
}
# 先session
session=requests.Session()
# 后session clear,clear这个是比较关键的写法。
session.headers.clear()
session.headers.update(
headers
)
resp=session.post(url)
requests添加代理
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
打印你请求的headers
print(response.request.headers)
技术改变命运