首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Python 抓取 POST 接口返回空:請求體格式不匹配(form vs json)

     編輯:程式設計綜合問答

問題代碼關鍵點

request.add_header('Content-Type','application/json')
# ...
f = urllib2.urlopen(request, json.dumps(GetFormDate(...)))

根因分析

  • 代碼設置 Content-Type: application/json,並用 json.dumps 發送 JSON 體。
  • 但目標站點(國美)抓包顯示 **Content-Type: application/x-www-form-urlencoded**,參數為 **form 表單編碼**(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-Typeapplication/jsonapplication/x-www-form-urlencoded
請求體json.dumps(整個對象)urllib.urlencode(字典),內層 paramJson 再 json.dumps
參數結構扁平化 JSONform 字段 + 字段值為 JSON 字符串的 paramJson

調試建議

  1. 用 Charles/Fiddler 抓包對比**自己發的包**與**瀏覽器發的包**,逐字段核對。
  2. 打印 body 確認格式:module=product&from=category&page=2¶mJson=%7B%22mobile%22%3Afalse%2C...
  3. 若仍失敗,檢查 Cookie、Referer、User-Agent、簽名參數等反爬字段。

總結

Python 抓 POST 接口返回空,90% 是 **Content-Type 與請求體格式不匹配**。抓包看瀏覽器發什麼格式,代碼就發什麼格式:form 就 urlencode,JSON 就 json.dumps,別混用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved