【问题标题】:Twill submit function not working with form斜纹提交功能不适用于表单
【发布时间】:2015-12-27 14:00:37
【问题描述】:

我正在尝试为页面编写一个带有斜纹的爬虫,它需要我登录。我可以填写表格。但是twill的submit()函数好像没有“点击”按钮。

Form name=fSSUser_Logon (#1)
## ## __Name__________________ __Type___ __ID________ __Value__________________
1     TFORM                    hidden    TFORM        SSUser.Logon 
2     TPAGID                   hidden    TPAGID       SRLpKQyn1yc8 
3     TEVENT                   hidden    TEVENT        
4     TXREFID                  hidden    TXREFID      2 
5     TOVERRIDE                hidden    TOVERRIDE     
6     TDIRTY                   hidden    TDIRTY       1 
7     TWKFL                    hidden    TWKFL         
8     TWKFLI                   hidden    TWKFLI        
9     TFRAME                   hidden    TFRAME        
10    TWKFLL                   hidden    TWKFLL        
11    TWKFLJ                   hidden    TWKFLJ        
12    TREPORT                  hidden    TREPORT       
13    TRELOADCMP               hidden    TRELOADCMP    
14    TRELOADID                hidden    TRELOADID    SRLpKQy1nyc7 
15    TOVERLAY                 hidden    TOVERLAY      
16    RELOGON                  hidden    RELOGON       
17    USERNAME                 text      USERNAME      
18    PASSWORD                 password  PASSWORD      
19    Logon                    button    Logon        Logon 

showforms() 同上。

按钮的实际代码如下:

<input type="button" class="clsButton" id="Logon" name="Logon" tabindex="3" value="Logon" title="Logon">

它没有我可以使用的任何形式。

到目前为止我的代码:

from twill.commands import *
from twill import get_browser

go("https://trakcarelabwebview.nhls.ac.za/trakcarelab/csp/logon.csp")
showforms()

fv("1", "USERNAME", "xx")
fv("1", "PASSWORD", "xx")
fv("1", "Logon", "Logon")

formaction('Logon','https://trakcarelabwebview.nhls.ac.za/trakcarelab/csp/logon.csp#TRAK_main')
submit()
show()
showforms()

框架“TRAK_main”是包含我需要的 HTML 的框架。 最后的 showforms() 显示的表单与“登录”之前的表单完全相同。

我在这里做错了什么?

【问题讨论】:

    标签: python forms web-scraping web-crawler twill


    【解决方案1】:

    我在这里做错了什么?

    你的答案就在这里:

    twill 不懂 javascript。

    browser 加载该页面时,页面上的 js 会执行,并且 js 会为登录按钮分配一个 onclick 事件处理程序。然后,当单击登录按钮时,事件处理函数设置隐藏表单字段之一的值。服务器在请求中检查该值,如果该值不存在,则登录失败,服务器将重定向回登录页面。

    由于twill不理解js,隐藏表单域的值永远不会被设置,因此当twill向服务器发送请求时,请求中缺少隐藏表单域的值。

    网站会尝试各种技巧来阻止程序访问其页面。

    【讨论】:

    • 我研究了页面而不是Javascript,即。 onClick() 事件被触发。我现在已经成功登录:formaction('Logon','trakcarelabwebview.nhls.ac.za/trakcarelab/csp/logon.csp') submit("Logon") 但现在问题是进入包含我想要的表单的正确框架。
    • 我设法用 Selenium 编写了完全相同的程序,并且运行良好。自动登录和自动搜索等。但是,显然我希望从命令行脚本完全自动化。尝试过机械化/刮擦等,但无济于事。看起来硒是唯一的方法......非常烦人。
    • @Albert,我设法用 Selenium 编写了完全相同的程序,并且运行良好。 对。 Selenium 开创了读取 html 页面文本并解释其中的 javascript 的能力,以克服斜纹等程序的缺陷。
    • @Albert,我研究了页面而不是 Javascript,即。 onClick() 事件get的触发 -- 页面我也研究过,代码中可以看到按钮的onclick事件,也可以看到js代码添加到表单的token,我验证了onclick 代码实际上是通过手动单击按钮并检查请求中发送的名称/值对来执行的。
    • 啊,我的错。你完全正确。看起来这个网页现在对我来说太聪明了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2019-01-14
    相关资源
    最近更新 更多