Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy:FormRequest不';t自动填充ASP.net隐藏字段_Python_Html_Forms_Web Scraping_Scrapy - Fatal编程技术网

Python Scrapy:FormRequest不';t自动填充ASP.net隐藏字段

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

我在用Scrapy刮认证屏幕后面的一些金子。该网站使用的是
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)]