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)
posted @ 2021-02-18 23:04  技术改变命运Andy  阅读(412)  评论(0编辑  收藏  举报