requests与json的使用技巧

requests

requestse基本使用

关于requests基本使用方法参照中文版参考文档:

http://docs.python-requests.org/zh_CN/latest/index.html

response.text 和response.content的区别

1
2
3
4
5
6
7
8
9
10
11
response.text
类型:str
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk”

response.content
类型:bytes
解码类型:没有指定
如何修改编码方式:response.content.deocde(“utf8”)

更推荐使用response.content.deocde()的方式获取响应的html页面

requests使用代理

1
2
3
4
5
requests.get("http://www.baidu.com", proxies = proxies)
proxies = {
"http": "http://12.34.56.79:9527",
"https": "https://12.34.56.79:9527",
}
代理的基本原理

mark

正向代理与反向代理

正向代理:浏览器明确知道要访问的是什么服务器,只不过目前无法达到,需要通过代理来帮助完成这个请求操作。

反向代理:浏览器不知道任何关于要请求的服务器的信息,需要通过Nginx请求。

mark

requests模拟登录的几种方法

  1. 实例化session,使用session发送post/get请求登录后的页面

    1
    2
    session = requests.session()
    response = session.get(url,headers)
  2. 在headers中添加cookie键,值为cookie字符串

  3. 在请求方法中添加cookie参数,接收字典形式的cookie

cookie和session区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

requests的几个小技巧(我认为的)

1
2
3
4
5
6
7
8
9
10
11
12
13
#把cookie对象转化为字典
reqeusts.util.dict_from_cookiejar
#把字典转化为cookie对象
reqeusts.util.cookiejar_from_dict
#url解码
reqeusts.util.unquote()
#url编码
reqeusts.util.quote()
#忽略SSL证书验证
response = requests.get("https://www.12306.cn/mormhweb/ ", verify=False)
#请求https的网站忽略SSL证书验证之后还是会出现警告信息,在请求前加上下面这句就可以禁用安全请求警告
#InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)
requests.packages.urllib3.disable_warnings()

通用的解析链接函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# coding=utf-8
import requests
from retrying import retry

headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}

@retry(stop_max_attempt_number=3)
def _parse_url(url,method,data,proxies):
print("*"*20)
if method=="POST":
response = requests.post(url,data=data,headers=headers,proxies=proxies)
else:
response = requests.get(url,headers=headers,timeout=3,proxies=proxies)
assert response.status_code == 200
return response.content.decode()


def parse_url(url,method="GET",data=None,proxies={}):
try:
html_str = _parse_url(url,method,data,proxies)
except:
html_str = None

return html_str

if __name__ == '__main__':
parse_url(url)

json

json的基本使用

1
2
3
4
json.loads() #json字符串转化为python数据类型
json.dumps() #python数据类型转化为json字符串
json.load() #包含json的类文件对象转化为python数据类型
json.dump() #python数据类型转化为包含json的类文件对象

什么是类文件对象?

具有read()或者write()方法的对象就是类文件对象,f = open(“a.txt”,”r”) f就是类文件对象

如何优雅的查看json?

我们经常在打印json数据的时候会遇到,像下图这样的情况

mark

我们只要在打印的时候使用pprint就可以完美避开这种情况了,效果如下:

mark

我们想要实现上图只需要pip install pprint并在打印时使用pprint即可,而在保存时只需要添加”indent=2”参数,就可以保存为pprint的样式。

煌金 wechat
扫描关注公众号,回复「1024」获取为你准备的特别推送~
  • 本文作者: 煌金 | 微信公众号【咸鱼学Python】
  • 本文链接: http://www.xianyucoder.cn/2018/09/01/requests-and-json/
  • 版权声明: 本博客所有文章除特别声明外,均采用 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!