Python 网络抓取:如何配置 multipart/form-data 负载
Python web scraping: How to configure multipart/form-data payload
我正在尝试抓取此网站:
https://kfz.virtuelles-rathaus.de/igv2-man/servlet/Internetgeschaeftsvorfaelle
但我不知道如何设置有效请求 body。
状态代码为 200,因此请求本身有效。
在响应中它说它无法处理数据,因为我使用了浏览器导航。它要我改用网站按钮。
我认为是因为负载配置不正确,但我无法让它工作。
我已经尝试过以下操作:
- 手动设置headers
- 使用requests_toolbelt.multipart.encoder
- 为 multipart/data-format 我自己创造边界
从Chrome Dev Tools
复制的decodedPayload
WKZ_UNTERSCH_Z: WT
WKZ_ERKENN_Z: SJ
WKZ_ZIFFERN: 454
WKZ_SUCHMERKMAL: NULL
BTN_WKZSUCHE: suchen
ZEITSTEMPEL: 2022040815031191
从 Chrome 开发工具
复制的 编码有效负载
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_UNTERSCH_Z"
WT
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_ERKENN_Z"
SJ
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_ZIFFERN"
454
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_SUCHMERKMAL"
NULL
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="BTN_WKZSUCHE"
suchen
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="ZEITSTEMPEL"
2022040815031191
------WebKitFormBoundaryj9dFOsSgrDr5dSwA--
我的代码:
import requests
from datetime import datetime
def main():
payload = {"WKZ_UNTERSCH_Z": "WT",
"WKZ_ERKENN_Z": "GH",
"WKZ_ZIFFERN": "454",
"WKZ_SUCHMERKMAL": "NULL",
"BTN_WKZSUCHE": "suchen",
"ZEITSTEMPEL": datetime.strftime(datetime.now(), '%Y%m%d%H%S%M%f')[:-4]}
url = 'https://kfz.virtuelles-rathaus.de/igv2-man/servlet/Internetgeschaeftsvorfaelle'
# Initialize Session and get Cookie with session ID
s = requests.Session()
r = s.get(f'{url}?MANDANT=08337000&AUFRUF=WKZ')
r = s.post(
f'{url}', data=payload, verify=False)
# Save Response for further scraping
with open('z_1.html', 'w') as f:
f.write(str(r.text))
if __name__ == '__main__':
main()
我已经提前感谢你们的帮助
编辑:
使用MultipartEncoder时创建的Body:
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_UNTERSCH_Z"
WT
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_ERKENN_Z"
SJ
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_ZIFFERN"
454
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_SUCHMERKMAL"
NULL
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="BTN_WKZSUCHE"
suchen
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="ZEITSTEMPEL"
2022040909485493
--b3dccffd58a47883c42249db16600856--
我找到了问题的答案
我不是数据格式的问题,而是我使用了错误的时间戳。
解决方案是使用上一个响应的时间戳而不是当前时间。
我正在尝试抓取此网站: https://kfz.virtuelles-rathaus.de/igv2-man/servlet/Internetgeschaeftsvorfaelle
但我不知道如何设置有效请求 body。 状态代码为 200,因此请求本身有效。 在响应中它说它无法处理数据,因为我使用了浏览器导航。它要我改用网站按钮。
我认为是因为负载配置不正确,但我无法让它工作。
我已经尝试过以下操作:
- 手动设置headers
- 使用requests_toolbelt.multipart.encoder
- 为 multipart/data-format 我自己创造边界
从Chrome Dev Tools
复制的decodedPayloadWKZ_UNTERSCH_Z: WT
WKZ_ERKENN_Z: SJ
WKZ_ZIFFERN: 454
WKZ_SUCHMERKMAL: NULL
BTN_WKZSUCHE: suchen
ZEITSTEMPEL: 2022040815031191
从 Chrome 开发工具
复制的 编码有效负载------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_UNTERSCH_Z"WT
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_ERKENN_Z"SJ
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_ZIFFERN"454
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="WKZ_SUCHMERKMAL"NULL
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="BTN_WKZSUCHE"suchen
------WebKitFormBoundaryj9dFOsSgrDr5dSwA
Content-Disposition: form-data; name="ZEITSTEMPEL"2022040815031191
------WebKitFormBoundaryj9dFOsSgrDr5dSwA--
我的代码:
import requests
from datetime import datetime
def main():
payload = {"WKZ_UNTERSCH_Z": "WT",
"WKZ_ERKENN_Z": "GH",
"WKZ_ZIFFERN": "454",
"WKZ_SUCHMERKMAL": "NULL",
"BTN_WKZSUCHE": "suchen",
"ZEITSTEMPEL": datetime.strftime(datetime.now(), '%Y%m%d%H%S%M%f')[:-4]}
url = 'https://kfz.virtuelles-rathaus.de/igv2-man/servlet/Internetgeschaeftsvorfaelle'
# Initialize Session and get Cookie with session ID
s = requests.Session()
r = s.get(f'{url}?MANDANT=08337000&AUFRUF=WKZ')
r = s.post(
f'{url}', data=payload, verify=False)
# Save Response for further scraping
with open('z_1.html', 'w') as f:
f.write(str(r.text))
if __name__ == '__main__':
main()
我已经提前感谢你们的帮助
编辑:
使用MultipartEncoder时创建的Body:
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_UNTERSCH_Z"WT
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_ERKENN_Z"SJ
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_ZIFFERN"454
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="WKZ_SUCHMERKMAL"NULL
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="BTN_WKZSUCHE"suchen
--b3dccffd58a47883c42249db16600856
Content-Disposition: form-data; name="ZEITSTEMPEL"2022040909485493
--b3dccffd58a47883c42249db16600856--
我找到了问题的答案
我不是数据格式的问题,而是我使用了错误的时间戳。
解决方案是使用上一个响应的时间戳而不是当前时间。