为什么对 formdata 进行 urlencode 然后用 utf-8 再次编码,这里的逻辑是什么?
why urlencode a formdata then encode it again with utf-8, what's logic here?
我正在阅读教程,发现这段代码真的很混乱。
from urllib import request, parse
print('Login to somesite.com...')
email = input('Email: ')
passwd = input('Password: ')
login_data = parse.urlencode([
('username', email),
('password', passwd),
('entry', 'mweibo'),
('client_id', ''),
('savestate', '1'),
('ec', ''),
('pagerefer', 'a referer') ])
req = request.Request('somesite.com')
req.add_header('Origin', 'a origin')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'a referer')
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
urlencode
在这里做什么,login_data.encode('utf-8'))
接下来做什么?
虽然它们具有相同的名称,但它们执行不同类型的操作:
- URL 编码用于调整一些数据作为 URL 的一部分发送。 URL对字符的种类有一定的限制,不能包含空格或@等特殊字符,因此必须转换以免混淆(例如空格变成
%20
)。在 parse
中,它基本上采用元组列表 (left, right)
并创建一个包含 name=value
列表且由 &
分隔的字符串。为了澄清,这里有一个例子
代码:
parse.urlencode([
(name1,value1), (name2, value2)
])
结果:
name1=value1&name2=value2
- UTF-8编码用于将字符映射到一个字节序列。 Char 必须表示为字节(与其他所有内容一样)并且存在各种映射。 UTF-8 是最常用的编码之一,因为它能够映射各种字符,同时保持最常用的字符简短。
我正在阅读教程,发现这段代码真的很混乱。
from urllib import request, parse
print('Login to somesite.com...')
email = input('Email: ')
passwd = input('Password: ')
login_data = parse.urlencode([
('username', email),
('password', passwd),
('entry', 'mweibo'),
('client_id', ''),
('savestate', '1'),
('ec', ''),
('pagerefer', 'a referer') ])
req = request.Request('somesite.com')
req.add_header('Origin', 'a origin')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'a referer')
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
urlencode
在这里做什么,login_data.encode('utf-8'))
接下来做什么?
虽然它们具有相同的名称,但它们执行不同类型的操作:
- URL 编码用于调整一些数据作为 URL 的一部分发送。 URL对字符的种类有一定的限制,不能包含空格或@等特殊字符,因此必须转换以免混淆(例如空格变成
%20
)。在parse
中,它基本上采用元组列表(left, right)
并创建一个包含name=value
列表且由&
分隔的字符串。为了澄清,这里有一个例子
代码:
parse.urlencode([
(name1,value1), (name2, value2)
])
结果:
name1=value1&name2=value2
- UTF-8编码用于将字符映射到一个字节序列。 Char 必须表示为字节(与其他所有内容一样)并且存在各种映射。 UTF-8 是最常用的编码之一,因为它能够映射各种字符,同时保持最常用的字符简短。