【问题标题】:Get Ajax Json Output with Python Requests Library使用 Python 请求库获取 Ajax Json 输出
【发布时间】:2013-11-23 22:54:56
【问题描述】:

我正在请求一个带有 Python 脚本的 Ajax 网站并获取 http://www.yurticikargo.com/bilgi-servisleri/Sayfalar/en-yakin-sube.aspx 的城市和分支机构

我完成了发布的第一步 {cityID: 34} 到这个 url 并获取 JSON 输出。

http://www.yurticikargo.com/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-sswservices.aspx/GetTownByCity

但我无法使用 Python 检索 JSON 输出,尽管我成功使用 Chrome Advanced Rest Client Extension,发布 {cityID:54,townID:5416,unitOnDutyFlag:null,closestFlag:2}

http://www.yurticikargo.com/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-unitservices.aspx/GetUnit

所有的源代码都在这里

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json


class Yurtici(object):

    baseUrl = 'http://www.yurticikargo.com/'
    ajaxRoot = '_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-sswservices.aspx/'
    getTown = 'GetTownByCity'
    getUnit = 'GetUnit'
    urlGetTown = baseUrl + ajaxRoot + getTown
    urlGetUnit = baseUrl + ajaxRoot + getUnit 
    headers = {'content-type': 'application/json','encoding':'utf-8'}

    def __init__(self):
        pass

    def ilceler(self, plaka=34): # Default testing value
        payload = {'cityId':plaka}
        url = self.urlGetTown
        r = requests.post(url, data=json.dumps(payload), headers=self.headers)
        return r.json() # OK

    def subeler(self, ilceNo=5902): # Default testing value
        # 5902 Çerkezköy 
        payload=  {'cityID':59,'townID':5902,'unitOnDutyFlag':'null','closestFlag':0}
        url = self.urlGetUnit
        headers = {'content-type': 'application/json','encoding':'utf-8'}
        r = requests.post(url, data=json.dumps(payload), headers=headers)
        print  r.status_code, r.raw.read()

if __name__ == '__main__':        
    a = Yurtici()
    print a.ilceler(37) # OK
    print a.subeler()   # NOT OK !!!

【问题讨论】:

标签: python ajax json python-requests


【解决方案1】:

您的代码未发布到您在文本示例中使用的相同网址。

让我们倒过来看看。首先,让我们看看失败的 POST。

url = self.urlGetUnit
headers = {'content-type': 'application/json','encoding':'utf-8'}
r = requests.post(url, data=json.dumps(payload), headers=headers)

所以我们发布到一个等于self.urlGetUnit 的URL。好的,让我们看看它是如何定义的:

baseUrl = 'http://www.yurticikargo.com/'
ajaxRoot = '_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-sswservices.aspx/'
getUnit = 'GetUnit'
urlGetUnit = baseUrl + ajaxRoot + getUnit

如果您在 urlGetUnit 中执行此操作,您会发现 URL 将是 http://www.yurticikargo.com/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-sswservices.aspx/GetUnit。让我们将其与您在 Chrome 中使用的 URL 放在一起来比较差异:

http://www.yurticikargo.com/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-sswservices.aspx/GetUnit
http://www.yurticikargo.com/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy-unitservices.aspx/GetUnit

看到区别了吗? ajaxRoot 对于两个 URL 来说并不相同。把它整理出来,你会得到一个 JSON 响应。

【讨论】:

  • 非常感谢,我困了 :) 现在我解决了。通过修复ajax url。而且,响应被编码为 gzip。我在这里用 zlib 解压它:stackoverflow.com/questions/2695152/…
  • 请求可以为您做到这一点。使用Response.contentResponse.textResponse.json(),Requests会自动解压。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多