Python Scrapy:FormRequest不';t自动填充ASP.net隐藏字段
我在用Scrapy刮认证屏幕后面的一些金子。该网站使用的是Python Scrapy:FormRequest不';t自动填充ASP.net隐藏字段,python,html,forms,web-scraping,scrapy,Python,Html,Forms,Web Scraping,Scrapy,我在用Scrapy刮认证屏幕后面的一些金子。该网站使用的是ASP.net,而ASP的表单上到处都是一些愚蠢的隐藏字段(比如\uuu VIEWSTATE,\uu EVENTTARGET) 当我调用FormRequest.from_response(response,…时,我希望它能从响应中自动读取这些隐藏字段,并将它们填充到formdata字典中-这是文档中说它应该做的 但是如果是这样的话,那么为什么只有当我明确列出这些字段并填充它们时,登录过程才起作用呢 class ItsyBitsy(Spid
ASP.net
,而ASP的表单上到处都是一些愚蠢的隐藏字段(比如\uuu VIEWSTATE
,\uu EVENTTARGET
)
当我调用FormRequest.from_response(response,…
时,我希望它能从响应中自动读取这些隐藏字段,并将它们填充到formdata
字典中-这是文档中说它应该做的
但是如果是这样的话,那么为什么只有当我明确列出这些字段并填充它们时,登录过程才起作用呢
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
//![CDATA[
var theForm=document.forms['form1'];
if(!theForm){
theForm=document.form1;
}
函数\uuuDoPostBack(eventTarget,eventArgument){
if(!theForm.onsubmit | |(theForm.onsubmit()!=false)){
格式为.\uuu EVENTTARGET.value=EVENTTARGET;
格式为.\uuu EVENTARGUMENT.value=EVENTARGUMENT;
submit()格式;
}
}
//]]
根据,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
属性
使用from_response()
登录不起作用,因为事件目标
具有空的值
属性。如果使用真实浏览器登录,事件目标
参数值将通过javascript设置为b_登录
函数调用。而且,由于Scrapy无法处理javascript(无法调用js函数),\u EVENTTARGET
发送时带有一个空值,这会导致登录失败
\uuu EVENTARGUMENT
也有一个空的值
,但它实际上被设置为\uuu doPostBack()
函数中的空字符串,因此在这里没有区别
希望有帮助。请显示
表单
标记的内容,输入在哪里。@alecxe完成了。应该不会有太大的区别,因为我显然能够使用XPATH检索它,对吧?我猜有多个表单。你能将'formname':'form1'
添加到formdata字典中进行测试吗?@SP1因为它不起到ex的作用期待。当认证后请求下一个页面时,我得到一个302
返回到登录页面。谢谢Alex。不过只有一个问题-如果是这样,为什么XPATH语句正确检索隐藏字段(如果它们是通过Javascript填充的,而Scrapy不执行Javascript函数)?@FloatingRock当然,除了\uuu EVENTTARGET
和\uu EVENTARGUMENT
之外,每个字段都有一个非空的值
属性。\uu EVENTARGUMENT
是不相关的,因为它总是空的。\uu EVENTTARGET
值必须手动设置为b\u login
。希望这对你有意义。啊,我明白了。所以我ust需要手动设置\uu EVENTTARGET
,其他所有设置实际上都由Scrapy填充。对其进行了测试,结果成功了!谢谢!!
descendant::textarea|descendant::select|descendant::input[@type!="submit" and @type!="image" and @type!="reset"and ((@type!="checkbox" and @type!="radio") or @checked)]