python中与服务器发送请求时 网络抓包及中文的编码问题

这片笔记主要说明两个内容:

一、网络抓包及web方面的知识

二、自于一个利用向服务器发送post类型的request时,中文如何发送给服务器的需求。

 

二话不说,先贴上源码,由于涉及urllib和urllib2的库,该源码要在python2 下运行,具体如下:

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib
import urllib2
import re
import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')

###########
####定制化的Handler
#http_hander = urllib2.HTTPHandler()
#urllib2.build_opener(http_hander)
#request = urllib2.Request("http://www.baidu.com")
###########

# 通过抓包的方式获取的url,并不是浏览器上显示的url
# url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"    # 该地址为自己在wireshark抓包获取到的源地址(但是有问题)

# 完整的headers
headers = {
        "Accept" : "application/json, text/javascript, */*; q=0.01",
        "X-Requested-With" : "XMLHttpRequest",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
        "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
    }


# -----------------------------------------------------------------------------------
# 此处比原版增加了中文翻译英文的功能
# 用户接口输入
key0 = raw_input("请输入需要翻译的文字:")
# key0 = '你好'
# print(repr(key0.decode('utf-8'))[3:-1])
# key0 = str(key0, encoding='utf-8')
# print(key0)
chpattern = re.compile('u([0-9a-zA-Z]{4})')
key1 = chpattern.findall(repr(key0.decode('utf-8'))[3:-1])
key = ''
for key_i in key1:
    key += '&#x'+str(key_i)+';'
# print(key)   #输出“&#xXXXX;&#xXXXX;&#xXXXX;&#xXXXX;”格式的中文编码 如“你好”的编码为:'你好'
# key = repr(key0.decode('utf-8'))[3:-1]
# key = unicode('你好','utf-8')
# print(key.decode('GB2312'))
# key = repr(key0)
# key = key0.decode('utf-16')
# key = urllib.quote(key0.decode(sys.stdin.encoding).encode('unicode'))
# key = key0.encode('unicode')
# print(key)
# key = '你好'
# -----------------------------------------------------------------------------------


formdata = {
"i":key,
"from":"auto",
"to":"auto",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":"1511219405946",
"sign":"f8965f67a1d3eee8a69ddf8ccc5f582b",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false"
}

# 经过urlencode转码
data = urllib.urlencode(formdata)

# 如果Request()方法里的data参数有值,那么这个请求就是POST
# 如果没有,就是Get
request = urllib2.Request(url, data = data, headers = headers)

rdata = urllib2.urlopen(request).read().decode('utf-8')
print (rdata)
#resultInfo = urllib2.urlopen(request).read().decode("unicode_escape")
#jInfo = json.loads(resultInfo)
#print(jInfo['translateResult'][0])
#jsonInfo = json.load(str(urllib2.urlopen(request).read().decode('utf-8')))
#print(jsonInfo)

strpattern = re.compile('"tgt":"(.*?)"')
strresult = strpattern.findall(rdata)
for i in strresult:
    print(i)

 

 

 

进入正题:

一、网络抓包和web通讯知识

(一)抓包

1、此处用到了wireshark抓包工具。192.168.0.104为本机地址  220.181.76.83(84)为服务器端地址,感觉83接收post请求,84接收get请求,待证实。

python中与服务器发送请求时 网络抓包及中文的编码问题_第1张图片

2、 "Accept" : "application/json, text/javascript, */*; q=0.01",
        "X-Requested-With" : "XMLHttpRequest",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",

        "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",(网页内容编码形式)

等headers中必要的信息可从上图中找到。

 

python中与服务器发送请求时 网络抓包及中文的编码问题_第2张图片

3、通过抓包获取到tgt:XXX 中的“XXX”对应着想要的目标翻译结果,通过正则匹配将其提取出来。

python中与服务器发送请求时 网络抓包及中文的编码问题_第3张图片

4、真实情况下浏览器向服务器发送的信息以表单的形式post给服务器,用python与服务器通讯时也得按该格式编制发送内容。

 

 

 

 

你可能感兴趣的:(编码常识,python,web,请求服务器,中文编码)