为何浏览器与Python Requests请求同一API返回JSON结果不一致?
解决jendela360 API返回空data数组问题
我尝试爬取网站https://jendela360.com/apartemen/jakarta-barat,找到了提供JSON数据的API接口:https://api.jendela360.com/api/site/apartment-search?price=0&sort=popular&page=1&aptId=&radius=5&latitude=0&longitude=0&filter_type=area&area=jakarta-barat&rowsPerPage=100
在浏览器中打开该API能看到完整的JSON结果,但运行以下Python Requests代码时,返回状态码200却得到空的data数组(data=[]),需要协助解决:
header={ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'id-ID,id;q=0.9', 'cache-control': 'max-age=0', 'cookie': '_ga=GA1.2.23833481.1667102529; _gid=GA1.2.3408225.1667102529; _fbp=fb.1.1667102531924.49727250', 'sec-ch-ua': '"Chromium";v="106", "Google Chrome";v="106", "Not;A=Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' } location='jakarta-barat' resp = requests.get(f'https://api.jendela360.com/api/site/apartment-search?price=0&sort=popular&page=1&aptId=&radius=5&latitude=0&longitude=0&filter_type=area&area={location}&rowsPerPage=12',headers=header) x=resp.json()['data'] print(x)
问题原因及解决方法
- Cookie失效:代码里的Cookie是旧的,服务器验证不通过就返回空数据。解决:打开浏览器开发者工具(F12),切换到Network标签,刷新API页面,找到对应的请求,复制Request Headers里的
Cookie字段替换代码中的值。 - 请求头不匹配:当前请求头是页面导航类型(比如
sec-fetch-dest: document),但API需要的是接口请求头。简化请求头,保留必要字段即可,比如User-Agent、Accept(改为application/json更贴合API需求)、有效Cookie。 - 参数差异:浏览器用的是
rowsPerPage=100,代码里是rowsPerPage=12,虽然一般不会导致空数据,但建议保持参数一致排查问题。
修改后的示例代码
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*', # 替换为浏览器中复制的有效Cookie 'Cookie': '这里填入你的有效Cookie' } location = 'jakarta-barat' url = f'https://api.jendela360.com/api/site/apartment-search?price=0&sort=popular&page=1&aptId=&radius=5&latitude=0&longitude=0&filter_type=area&area={location}&rowsPerPage=100' resp = requests.get(url, headers=headers) data = resp.json()['data'] print(data)
内容的提问来源于stack exchange,提问作者james iskandar
相关产品推荐
相关产品推荐

