【问题标题】:python requests post query fails:cookies?python请求后查询失败:cookies?
【发布时间】:2017-03-18 03:55:56
【问题描述】:

我正在尝试执行此post,但我得到server error 500

import requests
base_url = "https://www.assurland.com/ws/CarVehiculeSearch.asmx"
url = "%s/%s"% (base_url,"GetCarBodyTypeListByCarAlim")
pars ={"CarAlim":"DIES","CarType": "A7", "CodeMake": "AUDI", "FirstDrivingDate": "2015-09-22"}

with requests.Session() as s:
    r = s.post(url,data=pars)
    print r.status_code

 ## 500 

我想我需要设置 cookie 或其他东西。

提前感谢您的帮助。

【问题讨论】:

  • 您认为为什么需要设置 cookie? HTTP 服务器是一个黑盒子,它可以响应任何他们认为合适的请求。您需要试验它会接受什么标题和正文数据的组合以及它不会接受什么。许多服务器被配置为仅接受来自某些User-Agent 标头的请求,例如(客户端白名单)。您需要将您的 requests 请求与来自其他有效客户端的请求进行比较,并尝试两者之间的差异。
  • 目前,我什至无法让该网站在我的浏览器中运行。在我看来,该站点已损坏,因此也无法通过requests 从该站点获取结果。
  • 最后但同样重要的是,该站点还支持 SOAP 请求。您是否尝试过使用该 API 而不是将 POST 与 x-www-form-urlencoded 数据一起使用?
  • @agstudy:我的法语有点生疏,但我在main API page 上看到了 SOAP 文档。有several SOAP client libraries for Python

标签: python post web-scraping python-requests


【解决方案1】:

问题在于网站中处理不当的日期格式。

那个错误 500 带有这样的描述:

Erreur lors de la génération du document XML. ---> Le type common.FormDataListItem n'était pas attendu. Utilisez l'attribut XmlInclude ou SoapInclude pour spécifier les types qui ne sont pas connus statiquement.

在他们的页面上通过您的浏览器进行尝试,以获得更用户友好的调试: https://www.assurland.com/ws/CarVehiculeSearch.asmx?op=GetCarBodyTypeListByCarAlim

注意:“属性 XmlIncludeSoapInclude 倒指定符 les types qui ne sont pas connus statiquement”

所以我尝试了一些搜索以另一种格式输入日期。

例如:

Fri, 19 Jan 2001

19 Jan 2001

您收到200 OK 请求 - 在本例中为空结果。

不幸的是,在某年之后,该格式似乎也不被接受:2001 年 9 月 22 日产生 200 OK 但 2015 年 9 月 22 日不再 - 它一直持续到 2008-12-31.

尝试使用另一种日期时间格式...但看起来那里有任何东西...换一个网站:)

【讨论】:

    【解决方案2】:

    该网站上的大多数 API 访问点似乎都已损坏。您的代码本身没有问题。我实际上无法让网站响应他们自己的网络界面中的任何请求,即使使用常规浏览器也是如此。

    您也可以使用SOAP protocol 来创建查询的main API documentation 详细信息(法语); Python 有 several SOAP client libraries 你可以选择。

    但是,我没有运气让它工作。使用出色的zeep library,我尝试访问更简单的GetMainCarMakeListByFirstDrivingDate endpoint(请注意,我必须使用datetime() 对象来模拟时间戳):

    >>> from zeep import Client
    >>> client = Client('https://www.assurland.com/ws/CarVehiculeSearch.asmx?WSDL')
    >>> client.service.GetMainCarMakeListByFirstDrivingDate(FirstDrivingDate=datetime(2015, 9, 22))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/client.py", line 25, in __call__
        self._op_name, args, kwargs)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 109, in send
        return self.process_reply(client, operation_obj, response)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 145, in process_reply
        return self.process_error(doc, operation)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 223, in process_error
        detail=fault_node.find('detail'))
    zeep.exceptions.Fault: <exception str() failed>
    

    Fault 是 SOAP 等效项,此处为 500 错误。

    当我enable debug logging 时,我们可以看到服务器在产生响应时出现问题:

    >>> client.service.GetMainCarMakeListByFirstDrivingDate(FirstDrivingDate=datetime(2015, 9, 22))
    zeep.transports: HTTP Post to https://www.assurland.com/ws/CarVehiculeSearch.asmx:
    <?xml version='1.0' encoding='utf-8'?>
    <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
      <soap-env:Body>
        <ns0:GetMainCarMakeListByFirstDrivingDate xmlns:ns0="http://tempuri.org/">
          <ns0:FirstDrivingDate>2015-09-22T00:00:00</ns0:FirstDrivingDate>
        </ns0:GetMainCarMakeListByFirstDrivingDate>
      </soap-env:Body>
    </soap-env:Envelope>
    
    zeep.transports: HTTP Response from https://www.assurland.com/ws/CarVehiculeSearch.asmx (status: 500):
    <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Le serveur n'a pas pu traiter la demande. ---&gt; Erreur lors de la génération du document XML. ---&gt; Le type common.FormDataListItem n'était pas attendu. Utilisez l'attribut XmlInclude ou SoapInclude pour spécifier les types qui ne sont pas connus statiquement.</faultstring><detail /></soap:Fault></soap:Body></soap:Envelope>
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/client.py", line 25, in __call__
        self._op_name, args, kwargs)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 109, in send
        return self.process_reply(client, operation_obj, response)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 145, in process_reply
        return self.process_error(doc, operation)
      File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 223, in process_error
        detail=fault_node.find('detail'))
    zeep.exceptions.Fault: <exception str() failed>
    

    隐藏在里面的是错误信息:

    Le serverur n'a pas pu traiter la demande。 ---> Erreur lors de la génération du document XML。 ---> Le type common.FormDataListItem n'était pas Attendu。 Utilisez l'attribut XmlInclude ou SoapInclude pour specifier les types qui ne sont pas connus statiquement。

    或者,在谷歌翻译的帮助下,用英语:

    服务器无法处理请求。 ---> 生成 XML 文档时出错。 ---> 类型 common.FormDataListItem 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

    由于我们没有发送任何common.FormDataListItem 类型,并且消息抱怨不能生成任何 XML 文档,这看起来像是服务器端编程错误我。

    有一些方法可以通过 SOAP:

    >>> client.service.GetCarTypeListByCodeMake(CodeMake='BMW', FirstDrivingDate=datetime(2016, 1, 1))
    ['I3', 'I8', 'M2', 'M3', 'M4', 'M5', 'M6', 'SERIE 1 II', 'SERIE 2', 'SERIE 3 VI', 'SERIE 4', 'SERIE 5', 'SERIE 6', 'SERIE 7', 'X1', 'X3', 'X4', 'X5', 'X6', 'Z4']
    >>> client.service.GetAllCarTypeListByCodeMake(CodeMake='BMW')
    ['1502', '1600', '1602', '1800', '1802', '2000', '2002', '2500', '3,0', '3,3', '315', '316', '318', '320', '323', '324', '325', '328', '330', '518', '520', '523', '524', '525', '528', '530', '535', '540', '545', '550', '628', '630', '633', '635', '645', '650', '725', '728', '730', '732', '733', '735', '740', '745', '750', '760', '840', '850', 'I3', 'I8', 'L7', 'M2', 'M3', 'M4', 'M5', 'M535', 'M6', 'M635', 'SERIE 1', 'SERIE 1 II', 'SERIE 2', 'SERIE 3', 'SERIE 3 (SUITE)', 'SERIE 3 VI', 'SERIE 4', 'SERIE 5', 'SERIE 6', 'SERIE 7', 'X1', 'X3', 'X4', 'X5', 'X6', 'Z1', 'Z3', 'Z4', 'Z8']
    

    或通过application/x-www-form-urlencodedrequests 发布数据:

    >>> response = requests.post('https://www.assurland.com/ws/CarVehiculeSearch.asmx/GetCarTypeListByCodeMake', data={'CodeMake': 'BMW', 'FirstDrivingDate': datetime(2016, 1, 1)})
    >>> print(response.text)
    <?xml version="1.0" encoding="utf-8"?>
    <ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
      <anyType xsi:type="xsd:string">I3</anyType>
      <anyType xsi:type="xsd:string">I8</anyType>
      <anyType xsi:type="xsd:string">M2</anyType>
      <anyType xsi:type="xsd:string">M3</anyType>
      <anyType xsi:type="xsd:string">M4</anyType>
      <anyType xsi:type="xsd:string">M5</anyType>
      <anyType xsi:type="xsd:string">M6</anyType>
      <anyType xsi:type="xsd:string">SERIE 1 II</anyType>
      <anyType xsi:type="xsd:string">SERIE 2</anyType>
      <anyType xsi:type="xsd:string">SERIE 3 VI</anyType>
      <anyType xsi:type="xsd:string">SERIE 4</anyType>
      <anyType xsi:type="xsd:string">SERIE 5</anyType>
      <anyType xsi:type="xsd:string">SERIE 6</anyType>
      <anyType xsi:type="xsd:string">SERIE 7</anyType>
      <anyType xsi:type="xsd:string">X1</anyType>
      <anyType xsi:type="xsd:string">X3</anyType>
      <anyType xsi:type="xsd:string">X4</anyType>
      <anyType xsi:type="xsd:string">X5</anyType>
      <anyType xsi:type="xsd:string">X6</anyType>
      <anyType xsi:type="xsd:string">Z4</anyType>
    </ArrayOfAnyType>
    

    您可能必须联系此 API 的维护人员来解决这个问题,这不是您可以在 Python 端进行的工作。

    【讨论】:

    • 感谢您的详细解答。我不知道这是否有帮助,但测试来自浏览器的 GetCarTypeListByCodeMake 查询:assurland.com/ws/…` 与 CodeMake=BMWFirstDrivingDate=2016-01-01 对我来说很好。
    • @agstudy:确实,该功能确实有效。更多证据表明该网站完全被破坏了。
    • @agstudy:有趣;当您在 GetCarAlimListByCarType 方法中输入无效信息时,您会得到一个空响应,但有效信息会给您错误。这是该网站上 100% 的错误。
    猜你喜欢
    • 2014-09-25
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多