![](/img/trans.png)
[英]Python Requests: POST JSON and file (multiform data) in 1 single request
[英]Forming a nasty POST request using Requests Python library
我正在研究一个Python脚本,该脚本可自动帮助我在学校的添加类网络界面中添加类。 到目前为止,我已经可以通过网站验证并访问此add-a-class页面的HTML。 该界面的工作方式如下:
Status
下的项目表示我目前正在上这学期的课程。
在“添加类工作表”下,您有几个输入的5位数字,称为CRN
即34688
。 您一次可以输入10个CRN。
我当时想我可以简单地用我有兴趣添加的CRN查询URL。 以为这很简单,我打开了devtools,结果发现POST完全是一团糟。
这是当我尝试在“添加类工作表”中添加类时从Chrome开发工具下查询的URL获取的原始表单数据
term_in=201535&RSTS_IN=DUMMY&assoc_term_in=DUMMY&CRN_IN=DUMMY&start_date_in=DUMMY&end_date_in=DUMMY&SUBJ=DUMMY&CRSE=DUMMY&SEC=DUMMY&LEVL=DUMMY&CRED=DUMMY&GMOD=DUMMY&TITLE=DUMMY&MESG=DUMMY®_BTN=DUMMY&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=34688&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=ECEC&CRSE=451&SEC=001&LEVL=Undergraduate+Quarter&CRED=++++3.000&GMOD=Standard+Letter&TITLE=Computer+Arithmetic&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=31109&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=BIO&CRSE=141&SEC=073&LEVL=Undergraduate+Quarter&CRED=++++0.000&GMOD=Non+Gradeable+Unit&TITLE=Essential+Biology&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=31099&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=BIO&CRSE=141&SEC=B&LEVL=Undergraduate+Quarter&CRED=++++4.500&GMOD=Standard+Letter&TITLE=Essential+Biology&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=30091&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=ECE&CRSE=493&SEC=001&LEVL=Undergraduate+Quarter&CRED=++++4.000&GMOD=Standard+Letter&TITLE=Senior+Design+Project+III&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=31117&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=BIO&CRSE=141&SEC=001&LEVL=Undergraduate+Quarter&CRED=++++0.000&GMOD=Non+Gradeable+Unit&TITLE=Essential+Biology&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=31525&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=BIO&CRSE=141&SEC=072&LEVL=Undergraduate+Quarter&CRED=++++0.000&GMOD=Non+Gradeable+Unit&TITLE=Essential+Biology&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=30013&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=EXAM&CRSE=080&SEC=001&LEVL=Undergraduate+Quarter&CRED=++++0.000&GMOD=Non+Gradeable+Unit&TITLE=Common+Exam+Period+-+I&MESG=DUMMY&RSTS_IN=&assoc_term_in=201535&CRN_IN=34039&start_date_in=03%2F28%2F2016&end_date_in=06%2F11%2F2016&SUBJ=ENTP&CRSE=205&SEC=001&LEVL=Undergraduate+Quarter&CRED=++++3.000&GMOD=Standard+Letter&TITLE=Ready%2C+Set%2C+Fail&RSTS_IN=WR&CRN_IN=34889&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=&RSTS_IN=WR&CRN_IN=&assoc_term_in=&start_date_in=&end_date_in=®s_row=8&wait_row=0&add_row=10®_BTN=Submit+Changes
从外观上看,它似乎在请求中,您不仅添加了要添加的新 CRN,到目前为止添加的类也成为了新请求的一部分。
深入研究请求,似乎每个类,无论它已经是您计划中当前拥有的类,还是正在通过文本框添加的类,都遵循以下格式:
assoc_term_in=201535
CRN_IN=34688
start_date_in=03%2F28%2F2016
end_date_in=06%2F11%2F2016
SUBJ=ECEC
CRSE=451
SEC=001
LEVL=Undergraduate+Quarter
CRED=++++3.000
GMOD=Standard+Letter
TITLE=Computer+Arithmetic
MESG=DUMMY
RSTS_IN=
每个类具有13个关联的查询键和值。 我实际上不确定是否需要重新提交您已经添加的类,并且我愿意在必要时执行一些测试。
该请求本身是一个POST:
Request URL:https://school.edu/pls/duprod/bwckcoms.P_Regs
Request Method:POST
Status Code:200 OK
Remote Address:[some IP address]
我的问题是:
我是否可以将CRN直接提交到文本框,而不必重新设置讨厌的POST请求? (即某些这样做的Python库)。 似乎可以选择“机械化”,但是可以将“请求”与“机械化”一起使用吗? 我宁愿不重写进入该表单页面所需的所有身份验证。
如果上述选项不可行,那么有什么想法可以有效地重新构成POST请求?
您可以做的一件事是使用dict
来保存每个Requests文档中有关过帐请求的所有信息。 例如,您的代码可能如下所示:
import json
import requests
payload = {
"assoc_term_in":"201535",
"CRN_IN":"34688",
"start_date_in":"03%2F28%2F2016",
"end_date_in":"06%2F11%2F2016",
"SUBJ":"ECEC",
"CRSE":"451",
"SEC":"001",
"LEVL":"Undergraduate+Quarter",
"CRED":"++++3.000",
"GMOD":"Standard+Letter",
"TITLE":"Computer+Arithmetic",
"MESG":"DUMMY",
"RSTS_IN":""
}
r = requests.post("https://school.edu/pls/duprod/bwckcoms.P_Regs", data=json.dumps(payload))
print(r.text)
然后,您可以像使用普通词典一样更改所需的任何值。 如果您想使用#1,您的选择之一就是研究Selenium之类的东西,但是,我个人认为,如果您已经知道POST请求看起来像做上面的事情,则可能会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.