第一部分已经回答,但编辑不是。
我正在使用python和请求模块来抓取一个网站。因此,我必须“点击”一个续订按钮,这是一个包含在图像“pat_renewmark.gif”中的链接(href)。
HTML
<form name="checkout_form" method="POST" id="checkout_form">
<input type="HIDDEN" id="checkoutpagecmd">
<a href="#" onclick="return submitCheckout( 'sortByCheckoutDate', 'bycheckoutdate' )">
<img src="/screens/pat_sortbychkout.gif" alt="SORT BY DATE CHECKED OUT" border="0">
</a>
<input type="HIDDEN" name="currentsortorder" value="current_duedate">
<a href="#" onclick="return submitCheckout( 'requestRenewSome', 'requestRenewSome' )">
<img src="/screens/pat_renewmark.gif" alt="RENEW SELECTED ITEMS" border="0">
</a>
</form>
javascript (submitCheckout)
function submitCheckout(buttonname, buttonvalue)
{
var oHiddenID;
oHiddenID = document.getElementById("checkoutpagecmd");
oHiddenID.name = buttonname;
oHiddenID.value = buttonvalue;
//c29364j/c1365070 - prevent the patron from submitting twice
var oButtonSpan;
oButtonSpan = document.getElementById("checkoutbuttons0");
if (oButtonSpan) oButtonSpan.style.display = "none";
oButtonSpan = document.getElementById("checkoutbuttons1");
if (oButtonSpan) oButtonSpan.style.display = "none";
document.getElementById("checkout_form").submit();
return true;
}
显然 submitCheckout 传递了.name
和value
,这两者都被分配到”requestRenewSome”’, to the hidden input with the
id =“checkoutpagecmd”`。
之前我使用过请求模块,我可以处理简单的用户名和密码输入,例如:
HTML
<div class="formEntryArea">
<label for="extpatid">
<span class="formLabel">
Your username:
</span>
</label>
<input name="extpatid" id="extpatid" value="" size="20" maxlength="40">
<label for="extpatpw">
<span class="formLabel">
Your password:
</span>
</label>
<input name="extpatpw" id="extpatpw" type="PASSWORD" value="" size="20" maxlength="40">
</div>
蟒
import requests
with requests.Session() as c:
LOGIN_URL = "https://example.com"
USERNAME = “XXXXX”
PASSWORD = “YYYYY”
source = c.get(LOGIN_URL)
data_load = dict(extpatid=USERNAME,extpatpw=PASSWORD)
head_load = dict(referer=LOGIN_URL)
c.post(LOGIN_URL, data=data_load, headers=head_load)
但是,这里c.post每个输入只处理一个“值”(USERNAME或PASSWORD),并且不包含任何javascript代码。
看起来,对于上面的问题,我不得不发布两个属性/字符串
.name =&#39; requestRenewSome&#39;
.value =&#39; requestRenewSome&#39;
?或者方法与我附上的例子完全不同?
matino的答案(或来自t.m.adam的评论)解决了这个问题!不幸的是,用户必须通过单击“是”按钮来批准他确定要续订。
HTML
<form name="checkout_form" method="POST" id="checkout_form">
<input type="HIDDEN" id="checkoutpagecmd">
<input type="HIDDEN" name="currentsortorder" value="current_duedate">
<span id="checkoutbuttons0">
<input type="SUBMIT" name="renewsome" value="YES">
<input type="SUBMIT" name="donothing" value="NO">
</span>
</form>
因此我将'renewsome': 'YES'
添加到data_load
字典中,但这还不够。我不知道隐藏输入的值? id=checkoutpagecmd
和/或? name=currentsortorder
但无法找到有关如何继续的任何答案。
P.S。我知道这实际上是一个已知的问题,如果能够得到解答,我会将其分开。
答案 0 :(得分:1)
javascript代码实际上做的是动态地为隐藏输入分配名称和值。所以最后可能有两种情况:
<input type="hidden" id="checkoutpagecmd" name="sortByCheckoutDate" value= "bycheckoutdate">
或
<input type="hidden" id="checkoutpagecmd" name="requestRenewSome" value= "requestRenewSome">
知道了,你可以像这样发送http请求:
requests.post(url, data={'sortByCheckoutDate': 'bycheckoutdate'}) # 1st case
requests.post(url, data={'requestRenewSome': 'requestRenewSome'}) # 2nd case