2011-06-07 20 views
9

Tengo una página ASPX en https://searchlight.cluen.com/E5/CandidateSearch.aspx con un formulario en ella, que me gustaría enviar y analizar para obtener información.Envío de una solicitud de publicación a una página aspx

Usando urllib y urllib2 de Python Creé una solicitud posterior con los encabezados y el agente de usuario adecuados. Pero la respuesta html resultante no contiene la tabla de resultados esperada. ¿Estoy malentendido o me falta algún detalle obvio?

import urllib 
    import urllib2 

    headers = { 
     'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13)   Gecko/2009073022 Firefox/3.0.13', 
     'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8', 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
    # obtained these values from viewing the source of https://searchlight.cluen.com/E5/CandidateSearch.aspx 
    viewstate = '/wEPDwULLTE3NTc4MzQwNDIPZBYCAg ... uJRWDs/6Ks1FECco=' 
    eventvalidation = '/wEWjQMC8pat6g4C77jgxg0CzoqI8wgC3uWinQQCwr/ ... oPKYVeb74=' 
    url = 'https://searchlight.cluen.com/E5/CandidateSearch.aspx' 
    formData = (
     ('__VIEWSTATE', viewstate), 
     ('__EVENTVALIDATION', eventvalidation), 
     ('__EVENTTARGET',''), 
     ('__EVENTARGUMENT',''), 
     ('textcity',''), 
     ('dropdownlistposition',''), 
     ('dropdownlistdepartment',''), 
     ('dropdownlistorderby',''), 
     ('textsearch',''), 
    ) 

    # change user agent 
    from urllib import FancyURLopener 
    class MyOpener(FancyURLopener): 
     version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127   Firefox/2.0.0.11' 

    myopener = MyOpener() 

    # encode form data in post-request format 
    encodedFields = urllib.urlencode(formData) 

    f = myopener.open(url, encodedFields) 
    print f.info() 

    try: 
     fout = open('tmp.htm', 'w') 
    except: 
     print('Could not open output file\n') 

    fout.writelines(f.readlines()) 
    fout.close() 

Hay varias preguntas sobre este tema que fueron útiles (como how to submit query to .aspx page in python), pero estoy atascado en esto y pedir ayuda adicional, si eso es posible.

La página html resultante dice que debo iniciar sesión, pero la página aspx aparece en mi navegador sin ningún inicio de sesión.

Éstos son los resultados de la información():

Connection: close Fecha: Mar, 07 Jun 2011 17:05:26 GMT Servidor: Microsoft-IIS/6.0 Powered-X-By : ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: private Content-Type: text/html; charset = UTF-8 Content-Length: 1944

+0

De un vistazo rápido, no veo nada malo con su código. Intenté visitar el sitio web en mi navegador (Firefox 4.0) y recibí el siguiente mensaje: 'Ocurrió un error al procesar su solicitud. Por favor, inténtelo de nuevo (puede que necesite volver a iniciar sesión). ...' – Gregg

+0

¿Podría la página aspx de destino buscar algo en la sesión y tropezar porque no tenía la cookie de sesión aspnet en la solicitud en la que realiza su publicación? – ashelvey

+0

Gracias por sus respuestas. Puedo visitar el sitio en mi navegador porque añado la información de inicio de sesión, que no incluí aquí. Sí, parece ser un problema de sesión entre asp.net y mi navegador simulado. – user773328

Respuesta

2

Intenté mecanizar y urllib2, y mecanizar maneja mejor las cookies. Me puede enviar el formulario simplemente especificando con mecanizar:

browser= mechanize.Browser() 
    browser.select_form(form_name) 
    browser.set_value("Page$Next", name="pagenumber")  

no era necesario para replicar la solicitud postal manualmente, y mecanizar en este caso era capaz de manejar un formulario que se basa en Javascript.

7

ASP.Net utiliza una característica de seguridad que protege contra la manipulación de la ViewState por embedding specific information in it.

Es más que probable, el servidor está rechazando su solicitud debido a que el ViewState está siendo tratado como si hubiera sido manipulado. No puedo decir esto con absoluta certeza, pero ASP.Net tiene several security features que están incorporados en el marco que pueden estar impidiendo una publicación directa.

Si la sesión está involucrada en absoluto, entonces también deberá tener esto en cuenta. Para simular lo que está haciendo el navegador, deberá realizar los siguientes pasos:

  1. Solicite la página.
  2. Guarda la recopilación de cookies en una variable.
  3. Extraiga el ViewState a una variable.
  4. Publique con los valores de formulario apropiados, pasando tanto las cookies guardadas como la información de ViewState junto con la solicitud.

Mucho trabajo que sé, pero no demasiado difícil. Una vez más, puede que esta no sea la única fuente de sus problemas, pero vale la pena leerla para poder comenzar la solución de problemas.

+0

Gracias por esa respuesta, veo que la página caduca en mi navegador y solicita un inicio de sesión después de algún tiempo, por lo que esto podría resolverse en parte agregando una cookie a la solicitud. ¿Tendría algún consejo sobre cómo guardar la colección de cookies en una variable, como se menciona en el paso 2? – user773328

+0

En .Net es bastante fácil porque hay una CookiesCollection asociada con el objeto HttpWebRequest. Desafortunadamente, mi conocimiento de Python es casi nulo, pero pude buscar este recurso: http://www.voidspace.org.uk/python/articles/cookielib.shtml – Josh

+0

Disculpe una vez más, pero he tenido éxito usando urllib2 y cookielib para hacer múltiples solicitudes con la misma cookie a una página de muestra como amazon.com. También he leído sus enlaces, ahora estoy tratando de entender cómo abordar el paso 4, Extracto de ViewState a una variable, que intenté hacer en el código anterior. – user773328

Cuestiones relacionadas