1、将cookie对象转为字典
通过session实例登入而自动保存的cookies是一个cookiejar对象,并非普通文本,如果想保存则需将其先转为Python中的字典,然后再转为字符串,才可保存;
语法 | 含义 |
---|---|
requests.utils.dict_from_cookiejar(res.cookies) | 将cookie对象转为字典 |
requets.utils.cookiejar_from_dict(dic1cookie) | 将字典转为cookie对象 |
import requests
url = "https://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
res = requests.get(url, headers=headers)
print(res.cookies)
dictcookie = requests.utils.dict_from_cookiejar(res.cookies)
print(dictcookie)
2、json.dumps
语法 | 含义 |
---|---|
json.loads(str) | 将json字符串转为Python对象,可以这么理解,json.loads()函数是将字符串转化为字典 |
json.dumps(dict) | 将Python对象转为json字符串,可以这么理解,json.dumps()函数是将字典转化为字符串 |
json.load(文件句柄) | 从文件中读取,将string转换为dict |
json.dump(obj, fp) | 将dict类型转换为json字符串格式,再写入到文件 |
有s的操作的是对象,没有s的操作的是文件(一读一写)
dumps中的 ensure_ascii参数,作用将对象中包含有的非ASCII字符进行转义;即默认对中文进行转义,若想不被转义设为False即可;
import requests
import json
url = "https://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
res = requests.get(url, headers=headers)
dictcookie = requests.utils.dict_from_cookiejar(res.cookies)
strcookie = json.dumps(dictcookie)
with open("cookies.txt", "w") as f:
f.write(strcookie)
with open("cookies111.txt", "w") as f:
json.dump(dictcookie, f)
3、请求SSL验证
Python用requests发送https的请求时,有安全验证,将验证设置为false 即可verify=False
response = requests.get('https://www.12306.cn/index/',verify=False)
4、设置超时
timeout:
(1)只传入一个数时,将连接时间和读取时间设为同一个值;
(2)当传入含有两个值的元组时,第一个值是连接时间,第二个值是读取时间;传入的元组,最多两个值,超过两个值则报错;
(3)不设置值或者设为None,表示永久等待;
连接时间是浏览器发送请求开始到连接上目标url主机地址时所用的时间;
读取时间是浏览器已经连接到了目标服务器,然后进行内容数据获取时所用的时间,一般情况读取数据都是很快速的
res = requests.get(url,timeout=(1,3)
import requests
url = "https://www.python.org/"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=(3, 1))
print(res.content)
5、利用断言配合状态码判断是否请求成功
assert res.status_code==200
6、url编解码
url的参数中的中文时需要经过编码后来传递的;
requests.utils.unquote() 解码
requests.utils.quote() 编码
7、retring重新发送请求
需要从retrying中导入retry,将其作为装饰器使用 @retry(stop_max_attempt_number=3)
设置重发次数为3
import requests
from retrying import retry
url = "https://www.python.org/"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
@retry(stop_max_attempt_number=3)
def _parse():
print("代码执行了几次")
res = requests.get(url, headers=headers, timeout=(1, 1))
assert res.status_code == 200
print(res.content)
return res
def parse():
try:
html = _parse()
return html
except:
return None
if __name__ == '__main__':
res = parse()
print(res)