如何使用 python3+urllib 发送一个 applicationjson 的请求

Python017

如何使用 python3+urllib 发送一个 applicationjson 的请求,第1张

head = {

'Accept': '*/*',

'Host': '',

'Connection': 'keep-alive',

'Content-Length': '245',

'Origin': '',

'User-Agent': 'Mozilla/5.0 (MacintoshIntel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome'

'/51.0.2704.103 Safari/537.36',

'Content-Type': 'application/json',

'Accept': 'text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,*/*q=0.8',

'Referer': '',

'Accept-Language': 'zh-CN,zhq=0.8',

'Accept-Encoding': 'gzip, deflate'

}

cookie = cookiejar.CookieJar()

handler = urllib.request.HTTPCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

opener.addheader(head)

# 其他为了获取 cookie 的各种请求。

.....

.....

.....

parsed_request_data = json.dumps(self.hotel_search_request_data).encode()

response = openner.open(self.hotel_search_url, parsed_request_data)

刚入门python学习网络爬虫基础,我使用的python版本是python3.6.4,学习的教程参考 Python爬虫入门教程

python3.6的版本已经没有urllib2这个库了,所以我也不需要纠结urllib和urllib2的区别和应用场景

参考这篇官方文档 HOWTO Fetch Internet Resources Using The urllib Package 。关于http(s)请求一般就get和post两种方式较为常用,所以写了以下两个小demo,url链接随便找的,具体场景具体变化,可参考注释中的基本思路

POST请求:

GET请求:

注意,

使用ssl创建未经验证的上下文,在urlopen中需传入上下文参数

urllib.request.urlopen(full_url, context=context)

这是Python 升级到 2.7.9 之后引入的一个新特性,所以在使用urlopen打开https链接会遇到如下报错:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

所以,当使用urllib.urlopen打开一个 https 链接时,需要先验证一次 SSL 证书

context = ssl._create_unverified_context()

或者或者导入ssl时关闭证书验证

ssl._create_default_https_context =ssl._create_unverified_context

问题指明:post请求中文,无法进行编码,需要对参数进行“utf-8”的编码

尝试:按报错进行解决:

出现问题: 返回的response的中文数据为乱码

相当乱码的话,应该是编码不匹配的问题,尝试解决:

结果这乱码更加摸不着头脑了:

这个问题,一直弄了我一个晚上,太困睡觉,起床后,直到这篇解决我的问题: python 设置requests 编码,完美解决中文乱码问题 :

这个请求头直接印象下面乱码:

解决分析参考: 从python爬虫引发出的gzip,deflate,sdch,br压缩算法分析

就因为这个,让我弄了一晚,得到的经验是: 在测试bug的时候,尽量减少变量,能不要的,就不要