1、将cookie对象转为字典

通过session实例登入而自动保存的cookies是一个cookiejar对象,并非普通文本,如果想保存则需将其先转为Python中的字典,然后再转为字符串,才可保存;

语法 含义
requests.utils.dict_from_cookiejar(res.cookies) 将cookie对象转为字典
requets.utils.cookiejar_from_dict(dic1cookie) 将字典转为cookie对象
  1. import requests
  2. url = "https://www.baidu.com"
  3. headers = {
  4. "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"
  5. }
  6. res = requests.get(url, headers=headers)
  7. print(res.cookies)
  8. dictcookie = requests.utils.dict_from_cookiejar(res.cookies)
  9. 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即可;

  1. import requests
  2. import json
  3. url = "https://www.baidu.com"
  4. headers = {
  5. "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"
  6. }
  7. res = requests.get(url, headers=headers)
  8. dictcookie = requests.utils.dict_from_cookiejar(res.cookies)
  9. strcookie = json.dumps(dictcookie)
  10. with open("cookies.txt", "w") as f:
  11. f.write(strcookie)
  12. with open("cookies111.txt", "w") as f:
  13. json.dump(dictcookie, f)

3、请求SSL验证

Python用requests发送https的请求时,有安全验证,将验证设置为false 即可verify=False

  1. response = requests.get('https://www.12306.cn/index/',verify=False)

4、设置超时

timeout:
(1)只传入一个数时,将连接时间和读取时间设为同一个值;
(2)当传入含有两个值的元组时,第一个值是连接时间,第二个值是读取时间;传入的元组,最多两个值,超过两个值则报错;
(3)不设置值或者设为None,表示永久等待;

连接时间是浏览器发送请求开始到连接上目标url主机地址时所用的时间;

读取时间是浏览器已经连接到了目标服务器,然后进行内容数据获取时所用的时间,一般情况读取数据都是很快速的

  1. res = requests.get(url,timeout=(1,3)
  1. import requests
  2. url = "https://www.python.org/"
  3. headers = {
  4. "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"
  5. }
  6. res = requests.get(url, headers=headers, timeout=(3, 1))
  7. print(res.content)

5、利用断言配合状态码判断是否请求成功

  1. assert res.status_code==200

6、url编解码

url的参数中的中文时需要经过编码后来传递的;

  1. requests.utils.unquote() 解码
  2. requests.utils.quote() 编码

7、retring重新发送请求

需要从retrying中导入retry,将其作为装饰器使用 @retry(stop_max_attempt_number=3)
设置重发次数为3

  1. import requests
  2. from retrying import retry
  3. url = "https://www.python.org/"
  4. headers = {
  5. "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"
  6. }
  7. @retry(stop_max_attempt_number=3)
  8. def _parse():
  9. print("代码执行了几次")
  10. res = requests.get(url, headers=headers, timeout=(1, 1))
  11. assert res.status_code == 200
  12. print(res.content)
  13. return res
  14. def parse():
  15. try:
  16. html = _parse()
  17. return html
  18. except:
  19. return None
  20. if __name__ == '__main__':
  21. res = parse()
  22. print(res)