Pregunta

Por cierto ... este sitio web solo funciona con Internet Explorer ...

Estoy intentando desechar un sitio web para un cliente para poder automatizar una tarea para ellos. Básicamente, raspará para diferentes informes y buscará los tiempos de entrega y envíelos por correo electrónico al cliente. Mi programa de desguace funciona bien, el problema que estoy teniendo es iniciar sesión en el sitio web con mecanizar ya que el formulario de inicio de sesión está usando AJAX. He buscado una solución, pero parece que no puedo encontrar exactamente lo que estoy buscando.

A continuación se muestra la forma HTML y (de lo que puedo decir) el Ajax que lo maneja.

función tranLogin () {var url = 'login.aspx? isajax = true & eventTarget = tranlogin'; var postdata = form.Serialize ('form1'); AjaxRequest = new Ajax.Request (url, {método: 'post', postbody: postdata, oncomplete: transloginfinished, onfailure: reporterRor, Onexception: reportException}); }

función transloginfinished (serverResponse) {if (requestfailed) return; xmlnodes = serverResponse.ResponseXml; usrsite = "8000"; usrcode = decodexmlchar (xmlnodes.getElementsByTagName ('UserCode') [0] .Text); if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '-1') {alert (decodexmlchar (xmlnodes.getElementsByTagName ('failMsg') [0] .text)); Form.enable ('form1'); devolver; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '20') {Window.location.replace ('InitPasswd.aspx? Subsite =' + usrsite + '& Usercode =' + usrcode); devolver; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '14') {Window.location.replace ('Chgpasswd.aspx? Type = CHGPWD &SISSITE =' + USRSITE + '& USERCODE =' + USRCODE); devolver; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '16') {Window.location.replace ('ChgPasswd.aspx? Type = PwDEXPIRE & SEA devolver; } if (xmlnodes.getElementsBytagName ('LoginResult') [0] .Text == '0') {if (xmlnodes.getElementsByTagName ('pwdExpireWarning') [0] .Text == 'true') {var cambiepwdnow = window. confirmar (decodexmlchar (xmlnodes.getElementsBytagName ('pwdexpiremsg') [0] .Text)); if (changePwdnow == true) {window.location.replace ('chgpasswd.aspx? type = chgpwd & ussureSite =' + usrsite + '& userCode =' + usrcode); devolver; } // var arg = {Promptorsg: decodexmlchar (xmlnodes.getElementsBytagName ('pwdexpiremsg') [0] .Text), // botones: [{valor: "sí", rtnval: 1}, // {valor: "no ", rtnval: 0} //] //}; // var rtn = window.showModalDialog ('../ módulos/modalMessageBox.aspx', arg, "dialogHeight: 140px; dialogwidth: 500px; centro: 1; status: no;"); // if (rtn && rtn == 1) {// window.location.replace ('chgpasswd.aspx? type = chgpwd & ussureSite =' + usrsite + '& userCode =' + usrcode); // devolver; //}
} if (jtrim ($ ('txthospcode'). valor) == '') {hosplist = decodexmlchar (xmlnodes.getElementsByTagName ('hosplist') [0] .text) .split ('|'); if (hosplist.length <2) {selectedHospCode = hosplist [0] .split ('-') [0]; Transelectthosp (seleccionadohospcode); devolver; } $ ('divhosplist'). style.display = 'block';

                for(i=0;i<hospList.length;i++)
                {
                    if (hospList[i] != '')
                    {
                        divHospCode = document.createElement("div");
                        divHospCode.className='divHospCode';
                        $('divHospListBG').appendChild(divHospCode);
                        lnkHospCode = document.createElement("a");
                        if (hospList[i].length <= 33)
                            lnkHospCode.innerText = hospList[i];
                        else
                            lnkHospCode.innerText = hospList[i].substr(0,30) + '...';
                        lnkHospCode.title = hospList[i];
                        lnkHospCode.className = 'lnkHospCode';
                        divHospCode.appendChild(lnkHospCode);
                        lnkHospCode.onmouseover = function(){this.style.color = '#000000';}
                        lnkHospCode.onmouseout = function(){this.style.color = '#6c6c6c';}
                        lnkHospCode.onclick = function(){TranSelectHosp(this.innerText.split('-')[0]);}
                        if (i > 7 && $('divHospListBG').style.overflow != 'auto')
                        {
                            $('divHospListBG').style.height = '198px';
                            $('divHospListBG').style.overflow = 'auto';
                        }
                    }
                }
                return;
            }
            else
            {
                TranSelectHosp(JTrim($('txtHospCode').value));
            }
        }
     }

<form name="Form1" method="post" action="login.aspx" id="Form1">
Código de cuenta de entrada:
            <div class="divRight">
                <input name="txtHospCode" type="text" id="txtHospCode" class="inputClass" maxlength="4" />
            </div>
            <div class="divLeft">
                <span>Input User Code:</span>
            </div>
            <div class="divRight">
                <input name="txtUserCode" type="text" id="txtUserCode" class="inputClass" maxlength="6" />
            </div>
            <div class="divLeft">
                <span>Input Password:</span></div>
            <div class="divRight">
                <input name="txtPassword" type="password" id="txtPassword" class="inputClass" />
            </div>
            <div class="divLeft">
                <span>Login As:</span>
            </div>
            <div class="divRight">
                &nbsp;<input type="radio" name="rdLoginType" value="D" checked="checked" />Doctor&nbsp;&nbsp;
                <input type="radio" name="rdLoginType" value="T" />Other
            </div>
            <div class="divLeft">
            </div>
            <div class="divRight">
                <input class="buttonClass" id="btnOK" type="button" value="Enter" onclick="LoginIn();" />
                <input class="buttonClass" id="btnReset" type="button" value="Reset" onclick="ResetInput();" />
            </div>

Mi código hasta ahora


import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup
import html2text
import re

Navegador instalar

br = mecanize.browser ()

Tarro de las galletas

CJ = Cookielib.lwpcookiejar () br.set_cookiejar (CJ)

Opciones de navegador

br.set_handle_equiv (verdadero)

br.set_handle_gzip (verdadero)

br.set_handle_redirect (true) br.set_handle_referer (true) br.set_handle_robots (falso)

Sigue actualizar 0 pero no cuelga en actualización> 0

br.set_handle_refresh (mecanize._http.httprefreshprocessor (), max_time = 1)

Agente de usuario

br.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)')

Def login_to_website (login_url, login_form_name, usr_form_name, pwd_form_name, accT_code_name, usr, pwd, acct_code): "" "registra el usuario en el sitio web" "" ""

# Open the url of the login page
br.open(login_url)


# Select the login form name
br.select_form(login_form_name)

# Enter user's credentials into the form
br.form[acct_code_name] = acct_code
br.form[usr_form_name] = usr
br.form[pwd_form_name] = pwd
br.find_control(name='rdLoginType').value = ['T']

# Submit the form
print "Logging in as:", usr 
br.submit()

# print current url
print "We are now at:", br.geturl()

# print error
if br.geturl() == login_url:
    print "Login Failed"
else: print "Successfully logged in"

login_to_website ('https://www.website.com', 'form1', 'txtuserCode', 'txtpassword', 'txthospcode', usr, pwd, accTcode)

¿Fue útil?

Solución

Mecanizar no, que yo sepa, no procesa JavaScript. Entonces sus opciones son, en orden aproximado de lo que intentaría:

  • Apague JavaScript en su navegador y vea si aún puede iniciar sesión en el sitio. Si es así, intente usar mecanizar con ese proceso.
  • Intente resolver cuál es el efecto de la forma AJAX (tanto del lado del servidor como del lado del cliente), e intente emularlo usando Python. Si aún no lo has encontrado, algo como Firebug es invaluable para esto.
  • Use una de las diversas bibliotecas que permitan a Python tomar el control de un navegador real. Nunca he hecho esto, pero sé que hay envoltorios para al menos Firefox e IE.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top