目录
针对GET方法:
针对POST方法:
针对GET方法:
比如一个网站get方法的链接是“https://www.baidu.com/assist/test-get?name=test&age=20&class=&age=18”。可以看出该方法传递的参数中有重复的键age。遇到这种情况应该怎么做呢?
明显用字典方式请求是错误的, 因为字典中有相同的键会覆盖:
from urllib import parse
params = {
"name": "test",
"age": 20,
"class": "",
"age": 18
}
params2 = {
"name": "test",
"class": "",
"age": 18
}
parse.urlencode(params)
## name=test&age=18&class=
parse.urlencode(params2)
## name=test&age=18&class=
虽然看上去两个变量不一样,但实际上params等于params2,所以是无法构造以上get链接的。
既然字典不行,那我们可以换一个和字典类似的列表里嵌套元组:
from urllib import parse
params = [
("name", "test"),
("age", 20),
("class", ""),
("age", 18)
]
params2 = [
("name", "test"),
("class", ""),
("age", 18)
]
parse.urlencode(params)
## name=test&age=20&class=&age=18
parse.urlencode(params2)
## name=test&class=&age=18
此时就可以构造出get链接了。
针对POST方法:
首先要说明。如果以json形式(即请求头的Content-Type是application/json)传递参数时,是无法传递相同键的,因为正常来说json的传递是以字典传递的,即用户以字典发出请求,服务器端以字典处理(虽然服务器端收到的body中是以字符串或者字节形式的json)。
所以以下方法只针对form方式提交的,即请求头的Content-Type是application/x-www-form-urlencoded。其实和GET方法类似,只不过是,GET方法是将参数直接添加到url,而POST方法则是将参数存到body中。
比如“https://www.baidu.com/assist/test-post”传递的Form Data是
?
此处不做过多赘述,解决方法和GET方法相同,此处直接用列表嵌套元组方法:
from urllib import parse
data = [
("a", "a"),
("b", "b"),
("a", "aa"),
]
data_byte = parse.urlencode(data).encode("utf-8")
## data_byte: b'a=a&b=b&a=aa'
# requests请求:
import requests
requests.post(url="https://www.baidu.com/assist/test-post", data=data_byte, headers={"Content-Type": "application/x-www-form-urlencoded"})
# scrapy请求
Request(method="POST", url="https://www.baidu.com/assist/test-post", body=data_byte, headers={"Content-Type": "application/x-www-form-urlencoded"})
或者
FormRequest(url="https://www.baidu.com/assist/test-post", formdata=data)
最后,我们来看下urlencode源码中的注释,是将字典或者两个元素元组组成的列表转成url请求字符串:
?
|