看板 Python 關於我們 聯絡資訊
最近寫的小爬蟲遇到一個問題 就是網頁的表單資料是利用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://www.ptt.cc/bbs/Python/M.1509072345.A.A68.html
tedwu2001: 看contentType預設是x-www-form-urlencoded 10/27 10:53
tedwu2001: 所以長得就是像你打得那樣 10/27 10:53
但是我直接 params = {"data[base]":"2017-10-27", "data[base]":"", ...} 是失敗的
ckc1ark: 是不是應該用data: value就好? 10/27 11:07
neil987: 樓上是指ajax的部分嗎 10/27 11:10
ckc1ark: 如果ajax是網頁原本的行為 可以參考這篇 10/27 11:12
ckc1ark: http://tinyurl.com/y726rrqg 10/27 11:12
因為爬的網頁原本是用ajax送資料的 他送的資料我用console print出來是長這個樣子 但是我不知道怎用成dict格式
ckc1ark: 你的key重複了 在dict同個key只會留一筆 10/27 11:13
所以我想知道說ajax他value裡面如果遇到array他是如何處理成post接收的資料QQ
ckc1ark: https://stackoverflow.com/a/10233141 換這篇試試 10/27 11:15
嘗試過 value1 = {"base":["2017-10-27", "name", "", "3", 0], "data":["正常", "正常", "正常", "正常", "正常", "正常", "正常", "正常 ", "正常", "正常"]} value1 = urllib.urlencode(value1, True) 失敗QQ
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) 失敗
ckc1ark: data[base][] 10/27 11:35
neil987: 這也是失敗 怪了= = 10/27 11:36
neil987: 都是直接死在日期未填寫 10/27 11:36
ckc1ark: 可以看開發工具的Form Data有個view source可以按 10/27 11:39
ckc1ark: 看有沒有跟傳的一樣 10/27 11:39
ckc1ark: 你 10/27 11:39
neil987: 看起來是一樣的 可能要檢查其他東西惹= = 10/27 11:42
ckc1ark: 把所有header都代一樣的值 再一個一個刪 看刪到哪個會掛 10/27 11:50
neil987: WTF 他卡住了 10/27 12:06
tedwu2001: 要看server端怎麼處理request,可能很多 10/27 12:09
tedwu2001: 先改用json去試,說不定server端沒處理formdata 10/27 12:10
主要是 我要模擬前端對server送出requests的資料就好
handsomeLin: 唷他在送表單的時候用另外一個{}包住了 10/27 22:44
handsomeLin: 他server端處理可能是req.body.data.base.data這樣 10/27 22:45
handsomeLin: 的深度 10/27 22:45
handsomeLin: 上面多打一個data 靶他視為分開 10/27 22:47
handsomeLin: 簡而言之你post的資料少一層 10/27 22:47
handsomeLin: 寫成dict 或是 object形式的話大概就是 body = {data 10/27 22:51
handsomeLin: :{base:[],data:[]}} 10/27 22:51
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
neil987: 犯了很蠢的錯QQ 10/28 14:38
lemon651: 對server端你那樣做跟我講的是一樣意思的... 10/30 16:28
lemon651: param指的是querystring上的東西,他server端沒針對那 10/30 16:31
lemon651: 邊parse的話是不管的 10/30 16:31