Python请求中的POST查询失败:cookies问题?

7

我想执行这个post,但是我收到了服务器错误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 

我认为我需要设置cookies或其他东西。

提前感谢任何帮助。


最后但并非最不重要的,该网站还支持SOAP请求。您尝试过使用该API来代替使用带有x-www-form-urlencoded数据的POST吗? - Martijn Pieters
@MartijnPieters 谢谢你的关注。这里的SOAP是什么意思?哪个API? - agstudy
1
@agstudy:我的法语有点生疏,但我在主API页面上看到了SOAP文档。Python有几个SOAP客户端库 - Martijn Pieters
@agstudy:我尝试使用zeep客户端库访问GetMainCarMakeListByFirstDrivingDate终端节点,但也失败了。我已经检查了发送的SOAP消息,没有发现任何问题,所以看起来这个服务确实是出了问题。要么联系网站运营商,要么就放弃吧。 - Martijn Pieters
@agstudy:尽管如此,我仍然在下面打出了我的发现。 - Martijn Pieters
显示剩余4条评论
2个回答

5
该网站上大多数API访问点似乎都出现了问题。你的代码本身没有问题。实际上,我无法在他们自己的Web界面中得到任何请求的响应,即使使用常规浏览器也是如此。 主API文档详细介绍(以法语为例),您还可以使用SOAP协议创建查询;Python有几个SOAP客户端库可供选择。
然而,我尝试使用优秀的zeep访问更简单的GetMainCarMakeListByFirstDrivingDate端点时,也没有成功。请注意,我必须使用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错误的错误类型。

当我启用调试日志时,我们可以看到服务器在生成响应时出现了问题:

>>> 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>

隐藏在其中的错误信息:

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

或者,通过谷歌翻译帮助,用英语表达:

服务器无法处理请求。 ---> 生成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']

或者通过使用 requests 发送 application/x-www-form-urlencoded 数据进行发布:
>>> 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 查询:https://www.assurland.com/ws/CarVehiculeSearch.asmx?op=GetCarTypeListByCodeMake` ,使用 CodeMake=BMWFirstDrivingDate=2016-01-01 对我来说很好用。 - agstudy
@agstudy:确实,那个函数是有效的。这更证明了该网站只是出现了故障。 - Martijn Pieters
@agstudy:有趣的是,当您将无效信息输入到“GetCarAlimListByCarType”方法中时,您会得到一个空响应,但有效信息会给您带来错误。这绝对是该网站上的一个漏洞。 - Martijn Pieters

1
问题在于该网站处理日期格式存在问题。
该500错误带有以下描述:
Erreur lors de la g&#233;n&#233;ration du document XML. ---> Le type common.FormDataListItem n&#39;&#233;tait pas attendu. Utilisez l&#39;attribut XmlInclude ou SoapInclude pour sp&#233;cifier les types qui ne sont pas connus statiquement.

我建议你在他们的页面上尝试,以获得更加用户友好的调试体验:https://www.assurland.com/ws/CarVehiculeSearch.asmx?op=GetCarBodyTypeListByCarAlim

注意:"使用属性XmlIncludeSoapInclude来指定静态未知类型"

因此,我进行了一些搜索,尝试以其他格式输入日期。

例如:

Fri, 19 Jan 2001

或者 2001年1月19日

你会收到 200 OK 的请求 - 在这种情况下,结果为空。

enter image description here

很遗憾,在某个年份之后,该格式也不再被接受:2001年9月22日可以,但2015年9月22日不行——只能到2008年12月31日。尝试使用其他日期时间格式……但似乎没有可用的……换一个网站吧 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接