雖然現(xiàn)在自己寫后端都是用application/json作為數(shù)據(jù)傳輸?shù)姆绞剑俏欤趧e人的站點(diǎn)上爬數(shù)據(jù)時(shí)難免碰到依然使用x-www-form-urlencoded的同胞。
今天就在拿數(shù)據(jù)的時(shí)候掉坑了腺办。查看網(wǎng)絡(luò)請(qǐng)求,用的是x-www-form-urlencoded藻雌,然后就嘗試著用postman發(fā)請(qǐng)求,很順利地取到了數(shù)據(jù)斩个,接著就去寫爬蟲了胯杭。寫完跑不過(guò),服務(wù)器那邊一直返回500受啥,拿不到數(shù)據(jù)做个,查了一些資料后發(fā)現(xiàn)原來(lái)是用的編碼方式的問(wèn)題。下面就來(lái)具體講一下滚局。
x-www-form-urlencoded字符編碼的POST請(qǐng)求參數(shù)會(huì)被解析成文本
key1=value1&key2=value2&key3=value3
當(dāng)遇到array時(shí)居暖,會(huì)編碼成
key1=value1&key1=value2
然后這里就會(huì)有一個(gè)問(wèn)題了,當(dāng)數(shù)組中只有一個(gè)元素的時(shí)候編碼成
key1=value1
然而因?yàn)楸旧礞I值對(duì)就會(huì)被編碼成這個(gè)樣子藤肢,所以在服務(wù)端拿到數(shù)據(jù)解碼的時(shí)候太闺,它默認(rèn)會(huì)解碼成鍵值對(duì),而不是單一元素?cái)?shù)組嘁圈。這就個(gè)數(shù)據(jù)的傳遞帶來(lái)了麻煩省骂。
下面來(lái)談一下解決辦法,我不知道為什么就去用json.dumps()去轉(zhuǎn)那個(gè)數(shù)組然后放dist里面去試丑孩,然后就莫名其妙地拿到了數(shù)據(jù)......可能在解碼的時(shí)候他會(huì)去處理一下json的數(shù)據(jù)吧冀宴。
嗯,然后想了一下温学,這也不失為一種良好的防爬的方法略贮。把關(guān)鍵數(shù)據(jù)放在數(shù)組里邊,用x-www-form-urlencoded來(lái)傳仗岖,可能會(huì)讓寫爬蟲的人難受一會(huì)會(huì)逃延,哈哈哈~