python requests 发送中文参数的问题

一句话:python requests发送给中文网站的参数,需要先encode为网站对应的编码。

之前设计了一个针对朗珈病理查询系统的爬虫[1]。设计时向网站提交的刚好是住院号和病理号这些非中文参数,所以当时没有遇到中文参数这个坑。现在开始折腾影像系统的爬虫,就遇到了中文参数的问题。

我先使用一个字典来放post的参数:

然后使用request.post来请求数据:

结果发现各种姿势的中文参数都传不对:

直接在查询的网页里面输入中文姓名(如“张三”)并查询,用Fiddler抓包,可以看到上传的中文参数是这样的:,是某种编码

在python里面设置: Run之后看到上传的参数变成 。长得和网站的编码貌似不一样。

直接把网站用的编码 POST上去呢?也不行,抓包可以看到这个字符串变了:。在字符串前面加r 、在py文件加 都不行。

Google第一页的结果也没有直接的解决方法。《python使用requests模块参数编码的不同处理[2]》这篇比较新的博客文章讲了requests编码处理的几种方法,然而没有讲到点子上。但是在它和《关于在 python 中使用 requests 框架传入中文参数问题[3]》的启发下,终于找到了解决方法。

原来requests.post会把data参数重新编码[4],字符串中的%也会变(加了转义符也没用),而它编码之后也跟网站的编码对不上,所以才不行。

首先,先获得网站使用的编码。有的网站如某影像查询系统是写在响应头里面 ,有的网站如朗珈病理查询系统是写在HTML的META标签时里面 。找不到还可以用 来获取网站编码。

然后,在data字典的键值中指定编码:

使用其他的库如urllib3也能解决这个问题[4],但貌似也不方便。

[1]https://mp.weixin.qq.com/s?__biz=MzI0ODM1OTgzMw==&mid=2247483986&idx=1&sn=616b0910510c16e1db98d07501ec1853&chksm=e9a0bca4ded735b2d9d7eb31c8534b0da25ee026b168461373312189388783e1bd25ab600baa#rd

网页标题: 《从病理系统中批量获取Gleason评分并填入Excel》

[2]http://blog.csdn.net/m1mory/article/details/58309378

网页标题: 《python使用requests模块参数编码的不同处理 - CSDN博客》

[3]https://testerhome.com/topics/7989#reply-90214

网页标题: 《关于在 python 中使用 requests 框架传入中文参数问题 · TesterHome》

[4]http://www.voidcn.com/article/p-nsimlvtx-kn.html

网页标题: 《为啥requests和urllib,urllib2,urllib3的URL编码行为存在这种差异? - 程序园》

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171216G00VIY00?refer=cp_1026

扫码关注云+社区