IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 爬虫的请求参数字典中含有相同的键该怎么办? -> 正文阅读

[网络协议]爬虫的请求参数字典中含有相同的键该怎么办?

目录

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

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:25:09  更:2022-01-08 14:26:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:59:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码