爬虫的请求参数字典中含有相同的键该怎么办?

目录

针对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请求字符串:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值