request.add_header('Content-Type','application/json')
# ...
f = urllib2.urlopen(request, json.dumps(GetFormDate(...)))
Content-Type: application/json,並用 json.dumps 發送 JSON 體。module=product&from=category¶mJson=...)。import urllib, urllib2, json
def GetFormDate(pageNum, catId):
ret = {
"module": "product",
"from": "category",
"page": str(pageNum),
"paramJson": json.dumps({ # 內層 paramJson 是 JSON 字符串
"mobile": False, "catalog": "coo8Store", "siteId": "coo8Site",
"shopId": "", "regionId": "31010100", "pageName": "list",
"et": "", "XSearch": False, "startDate": 0, "endDate": 0,
"pageSize": 48, "state": 4, "weight": 0, "more": 0,
"sale": 0, "instock": 1, "filterReqFacets": None,
"rewriteTag": False, "userId": "", "priceTag": 0,
"catId": catId
})
}
return ret
# 構建 form 數據
form_data = GetFormDate(2, "cat15965738")
body = urllib.urlencode(form_data) # 關鍵:form 編碼
req = urllib2.Request("https://www.gome.com.cn/p/asynSearch")
req.add_header("Referer", "https://www.gome.com.cn/category/cat15965738.html")
req.add_header('Content-Type', 'application/x-www-form-urlencoded') # 修正 Content-Type
req.add_header('X-Requested-With', 'XMLHttpRequest')
# 其他頭按需保留...
resp = urllib2.urlopen(req, body)
content = resp.read()
print(content)
| 項目 | 原代碼(錯) | 修正後(對) |
|---|---|---|
| Content-Type | application/json | application/x-www-form-urlencoded |
| 請求體 | json.dumps(整個對象) | urllib.urlencode(字典),內層 paramJson 再 json.dumps |
| 參數結構 | 扁平化 JSON | form 字段 + 字段值為 JSON 字符串的 paramJson |
body 確認格式:module=product&from=category&page=2¶mJson=%7B%22mobile%22%3Afalse%2C...Python 抓 POST 接口返回空,90% 是 **Content-Type 與請求體格式不匹配**。抓包看瀏覽器發什麼格式,代碼就發什麼格式:form 就 urlencode,JSON 就 json.dumps,別混用。