民间,
试图学习requests
模块的python ...以及一个简单的项目来拉动任何待定的停车票。
这是在GET
和POST
请求之间保存会话和Cookie的正确方法吗?
#!/usr/bin/env python
import requests
import urllib
session = requests.Session()
tokenRequest = session.get('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch')
sessionToken = tokenRequest.cookies['__RequestVerificationToken']
sessionCookies = tokenRequest.cookies
sessionHeaders = tokenRequest.headers
payload = {
'__RequestVerificationToken': sessionToken,
'ItemSearchQuestionUserInput': 'myplate',
'Questions[0].IsRequired': 'True',
'Questions[0].Sequence': 1,
'Questions[0].Text': 'PlateNumber',
'Questions[0].Type': 'Text',
'ItemSearchQuestionUserInput[1].QuestionAnswer': 'NY',
'Questions[1].IsRequired': 'True',
'Questions[1].Sequence': 2,
'Questions[1].Text': 'State',
'Questions[1].Type': 'Text',
'Questions[2].IsRequired': 'False',
'Questions[2].Sequence': 3,
'Questions[2].Text': 'PlateType',
'Questions[2].Type': 'Text',
'SubmitButton': 'Continue'
}
raw = urllib.urlencode(payload)
plateRequest = session.post('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch/Submit', data=raw, headers=sessionHeaders, cookies=sessionCookies)
print plateRequest.text
似乎不起作用......我确信它缺少一些简单的东西。他们的网站在这里:https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch
谢谢!
答案 0 :(得分:6)
服务器似乎特别关注接收明确的Content-Type: application/x-www-form-urlencoded
标头,requests
默认情况下不会发送标头。此外,如果您在表单中将其__RequestVerificationToken
提交,它也不会接受__RequestVerificationToken
Cookie的值 - 您需要解析{{1}返回的表单中的实际值}。您的表单数据也不会跟随原始表单中的实际输入字段 - 您已省略其中的一些,并且您已通过https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch
而不是ItemSearchQuestionUserInput
。另一件事是你实际上提供了从第一个请求收到的响应标题作为第二个请求的请求标题,这没有多大意义 - 这两种情境不像你想象的那样可以互换。
我已经修改了您的代码,以至于我收到了"我们无法找到任何匹配项。请检查您的输入,然后重试。"在浏览器中提交表单时我也会得到的消息 - 我没有真正的美国车牌进行测试。请注意,我已经对lxml
module引入了额外的依赖项,用于解析第一个请求返回的表单。
ItemSearchQuestionUserInput[0].QuestionAnswer