Enviar una solicitud de publicación a una página aspx

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

Usando urllib y urllib2 de Python, creé una solicitud de publicación 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 estoy perdiendo 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 resultaron útiles (por ejemplo, cómo enviar una consulta a la página .aspx en python ) pero estoy atascado en esto y solicito ayuda adicional, si es posible.

La página html resultante indica que es posible que deba iniciar sesión, pero la página aspx se muestra en mi navegador sin ningún inicio de sesión.

Aquí están los resultados de info ():

    Conexión: cerrar Fecha: martes, 7 de junio de 2011 17:05:26 Servidor GMT: Microsoft-IIS / 6.0 X-Powered By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: privado Content-Type: texto / html; conjunto de caracteres = utf-8 Contenido-Longitud: 1944

    ASP.Net utiliza una función de seguridad que protege contra la manipulación de ViewState al incrustar información específica en él.

    Lo más probable es que el servidor rechace su solicitud porque el ViewState se trata como si fuera manipulado. No puedo decir esto con absoluta certeza, pero ASP.Net tiene varias características de seguridad integradas en el marco que pueden impedir una publicación directa.

    Si se trata de una sesión, también deberá tener eso en cuenta. Para simular lo que hace el navegador, deberá realizar los siguientes pasos:

    1. Solicita la página.
    2. Guarda la colección de cookies en una variable.
    3. Extraer 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 conozco, pero no demasiado difícil. Una vez más, puede que esta no sea la única fuente de sus problemas, pero vale la pena leerlos para comenzar a solucionarlos.

    Intenté mecanizar y urllib2, y mecanizar los manejadores de cookies mejor. Puedo enviar el formulario simplemente especificando con mecanizar:

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

    No fue necesario replicar la solicitud de publicación manualmente, y la mecanización en este caso fue capaz de manejar un formulario que se basa en javascript.