'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的时候,尽量减少变量,能不要的,就不要 。