作者neil987 (R5大小姐-EX人品崩坏)
看板Python
标题[问题] jQuery的.ajax
时间Fri Oct 27 10:45:40 2017
最近写的小爬虫遇到一个问题
就是网页的表单资料是利用javascript截取之後
再利用.ajax送出去
$.ajax({
url: "my url",
data: {data:value},
type: "POST",
dataType: 'text',
success: function (msg) {
...
}
});
value用console看起来长这个样子
{base: Array(5), data: Array(7)}
base: (5) ["2017-10-27", "name", "", "3", 0]
data: (7) ["正常", "正常", "正常", "正常", "正常", "正常", "正常"]
不过用chrome的开发工具看了一下POST出去的资料
data[base][]:2017-10-27
data[base][]:name
data[base][]:
data[base][]:3
data[base][]:0
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
data[data][]:正常
感觉就不太对
在python底下直接送这个也是错的
想请问一下 jQuery里面的ajax在POST表单的时候 他转换成requests的payload
会长成什麽样子?
感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.120.251.134
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1509072345.A.A68.html
1F:→ tedwu2001: 看contentType预设是x-www-form-urlencoded 10/27 10:53
2F:→ tedwu2001: 所以长得就是像你打得那样 10/27 10:53
但是我直接
params = {"data[base]":"2017-10-27",
"data[base]":"",
...}
是失败的
3F:推 ckc1ark: 是不是应该用data: value就好? 10/27 11:07
4F:→ neil987: 楼上是指ajax的部分吗 10/27 11:10
5F:推 ckc1ark: 如果ajax是网页原本的行为 可以参考这篇 10/27 11:12
因为爬的网页原本是用ajax送资料的
他送的资料我用console print出来是长这个样子
但是我不知道怎用成dict格式
7F:→ ckc1ark: 你的key重复了 在dict同个key只会留一笔 10/27 11:13
所以我想知道说ajax他value里面如果遇到array他是如何处理成post接收的资料QQ
尝试过
value1 = {"base":["2017-10-27", "name", "", "3", 0],
"data":["正常", "正常", "正常", "正常", "正常", "正常", "正常", "正常
", "正常", "正常"]}
value1 = urllib.urlencode(value1, True)
失败QQ
9F:推 ckc1ark: value1 = {"data[base][]":["20 ... 这样呢 10/27 11:26
value1 = {"data[base]":["2017-10-27", "name", "", "3", "0"],
"data[data]":["正常", "正常", "正常", "正常", "正常", "正常", "正常",
"正常", "正常", "正常"]}
value1 = urllib.urlencode(value1, True)
失败
10F:推 ckc1ark: data[base][] 10/27 11:35
11F:→ neil987: 这也是失败 怪了= = 10/27 11:36
12F:→ neil987: 都是直接死在日期未填写 10/27 11:36
13F:推 ckc1ark: 可以看开发工具的Form Data有个view source可以按 10/27 11:39
14F:→ ckc1ark: 看有没有跟传的一样 10/27 11:39
15F:→ ckc1ark: 你 10/27 11:39
16F:→ neil987: 看起来是一样的 可能要检查其他东西惹= = 10/27 11:42
17F:推 ckc1ark: 把所有header都代一样的值 再一个一个删 看删到哪个会挂 10/27 11:50
18F:→ neil987: WTF 他卡住了 10/27 12:06
19F:→ tedwu2001: 要看server端怎麽处理request,可能很多 10/27 12:09
20F:→ tedwu2001: 先改用json去试,说不定server端没处理formdata 10/27 12:10
主要是 我要模拟前端对server送出requests的资料就好
21F:推 handsomeLin: 唷他在送表单的时候用另外一个{}包住了 10/27 22:44
22F:→ handsomeLin: 他server端处理可能是req.body.data.base.data这样 10/27 22:45
23F:→ handsomeLin: 的深度 10/27 22:45
24F:推 handsomeLin: 上面多打一个data 靶他视为分开 10/27 22:47
25F:→ handsomeLin: 简而言之你post的资料少一层 10/27 22:47
26F:→ handsomeLin: 写成dict 或是 object形式的话大概就是 body = {data 10/27 22:51
27F:→ handsomeLin: :{base:[],data:[]}} 10/27 22:51
28F:推 handsomeLin: 可以的话可以传网址给喔 我帮你测 10/27 22:53
好像不是这个样子 因为这样送出去的url怪怪的
WTF 最後解法是
原:
value1 = {"data[base][]":["2017-10-28", "name", "", "3", 0],
"data[data][]":["正常", "正常", "正常", "正常", "正常", "正常", "正常
", "正常", "正常", "正常"]}
value2 = urllib.urlencode(value1, True)
f = res.post(get_data_url, headers = headers, param = value2)
改成:
value1 = 不变
valeu2 = 不变
f = res.post(get_data_url, headers = headers, data = value2)
就可以了= =
※ 编辑: neil987 (219.68.18.225), 10/28/2017 14:33:59
29F:→ neil987: 犯了很蠢的错QQ 10/28 14:38
30F:推 lemon651: 对server端你那样做跟我讲的是一样意思的... 10/30 16:28
31F:推 lemon651: param指的是querystring上的东西,他server端没针对那 10/30 16:31
32F:→ lemon651: 边parse的话是不管的 10/30 16:31