gpt4 book ai didi

python - Scrapy:FormRequest 不会自动填充 ASP.net 隐藏字段

转载 作者:太空狗 更新时间:2023-10-30 02:20:23 24 4
gpt4 key购买 nike

我正在使用 Scrapy 来收集身份验证屏幕后面的一些黄金。该网站使用 ASP.net 并且 ASP 在整个表单中散布着一些愚蠢的隐藏字段(如 __VIEWSTATE__EVENTTARGET)。

当我调用 FormRequest.from_response(response,... 时,我希望它自动从响应中读取这些隐藏字段并将它们填充到 formdata 字典中- 这就是 Scrapy's FormRequest 文档所说的应该做的。

但如果是这样的话,为什么只有当我明确列出这些字段并填充它们时登录过程才有效?

class ItsyBitsy(Spider):
name = "itsybitsy"
allowed_domains = ["website.com"]
start_urls = ["http://website.com/cpanel/Default.aspx"]

def parse(self, response):
# Performs authentication to get past the login form
sel = Selector(response)
return [FormRequest.from_response(response,
formdata={
'tb_Username':'admin',
'tb_Password':'password',

# The following fields should be auto populated, right?
# So why does removing 'em break the login (w/500 Server Error)
'__VIEWSTATE':
sel.xpath("//input[@name='__VIEWSTATE']/@value").extract(),
'__EVENTVALIDATION':
sel.xpath("//input[@name='__EVENTVALIDATION']/@value").extract(),
'__EVENTTARGET': 'b_Login'

},
callback=self.after_login,
clickdata={'id':'b_Login'},
dont_click=True)]

def after_login(self, response):
# Mmm, scrumptious
pass

编辑:添加表单 HTML

<form id="form1" action="Default.aspx" method="post" name="form1">
<div>
<input type="hidden" value="" id="__EVENTTARGET" name="__EVENTTARGET">
<input type="hidden" value="" id="__EVENTARGUMENT" name="__EVENTARGUMENT">
<input type="hidden" value="/wEPDwULLTE2OTg2NjA1NTAPZBYCAgMPZBYGAgMPD2QWAh4Kb25rZXlwcmVzcwUlcmV0dXJuIGNsaWNrQnV0dG9uKGV2ZW50LCAnYl9Mb2dpbicpO2QCBQ8PZBYCHwAFJXJldHVybiBjbGlja0J1dHRvbihldmVudCwgJ2JfTG9naW4nKTtkAgcPD2QWAh4Hb25jbGljawUPcmV0dXJuIGxvZ2luKCk7ZGRKt/WTOQThVTxB9Y0QcIuRqylCIw==" id="__VIEWSTATE" name="__VIEWSTATE">
</div>

<script type="text/javascript">
//&lt;![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]&gt;
</script>


<div>

<input type="hidden" value="/wEWBAK0o8DDCQLxz5rcDwLF8dCIDALHyYWSA+rA4VJNaEpFIycMDHQPUOz393TI" id="__EVENTVALIDATION" name="__EVENTVALIDATION">
<input type="text" onkeypress="return clickButton(event, 'b_Login');" size="28" class="textfield-text" id="tb_Username" name="tb_Username">
<input type="password" onkeypress="return clickButton(event, 'b_Login');" size="28" class="textfield-text" id="tb_Password" name="tb_Password">
<a href="javascript:__doPostBack('b_Login','')" class="button-link" id="b_Login" onclick="return login();">Login</a>
</form>

最佳答案

根据source code , Scrapy 使用以下 CSS 选择器来解析表单外的输入:

descendant::textarea|descendant::select|descendant::input[@type!="submit" and @type!="image" and @type!="reset"and ((@type!="checkbox" and @type!="radio") or @checked)]

换句话说,所有隐藏的输入都被成功解析(并在稍后与请求一起发送),其值等于 value 属性。所以,Scrapy 在这里做了它应该做的事情。

使用 from_response() 的登录不起作用,因为 __EVENTTARGET 具有空的 value 属性。如果您使用真实浏览器进行登录,__EVENTTARGET 参数值将通过 javascript __doPostBack() 函数调用设置为 b_Login。并且,由于 Scrapy 无法处理 javascript(无法调用 js 函数),__EVENTTARGET 会发送一个空值,这会导致登录失败。

__EVENTARGUMENT 也有一个空的 value,但它实际上在 __doPostBack() 函数中设置为空字符串,所以它不会在这里有所作为。

希望对您有所帮助。

关于python - Scrapy:FormRequest 不会自动填充 ASP.net 隐藏字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23577320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com