Einreichen einer Beitragsanfrage an eine aspx-Seite

Ich habe eine ASPX-Seite unter https://searchlight.cluen.com/E5/CandidateSearch.aspx mit einem Formular auf, dass ich gerne einreichen und parsen für Informationen.

Mit Python's urllib und urllib2 habe ich eine Post-Anfrage mit den richtigen Header und User Agent erstellt. Aber die resultierende html-Antwort enthält nicht die erwartete Tabelle der Ergebnisse. Bin ich Missverständnis oder fehlt mir irgendwelche offensichtlichen Details?

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() 

Es gibt mehrere Fragen zu diesem Thema, die hilfreich waren (wie zum Beispiel, wie man eine Abfrage auf die aspx-Seite in python abgibt ), aber ich stecke dabei und verlange nach zusätzlicher Hilfe, wenn das möglich ist.

Die resultierende html-Seite sagt, dass ich mich vielleicht anmelden muss, aber die aspx-Seite wird in meinem Browser ohne Login angezeigt.

Hier sind die Ergebnisse von info ():

Verbindung: schließen Datum: Di, 07 Jun 2011 17:05:26 GMT Server: Microsoft-IIS / 6.0 X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: privat Content-Type: Text / html; Charset = utf-8 Inhalt-Länge: 1944

    2 Solutions collect form web for “Einreichen einer Beitragsanfrage an eine aspx-Seite”

    ASP.Net verwendet eine Sicherheitsfunktion, die vor der Manipulation mit der ViewState schützt, indem sie spezifische Informationen in sie einbindet.

    Mehr als wahrscheinlich, der Server lehnt Ihre Anfrage ab, weil die ViewState behandelt wird, als ob sie manipuliert wurden. Ich kann das nicht mit absoluter Sicherheit sagen, aber ASP.Net hat mehrere Sicherheitsmerkmale , die in das Framework eingebaut sind, das einen direkten Post verhindern kann.

    Wenn Session überhaupt beteiligt ist, dann müssen Sie das auch berücksichtigen. Um zu simulieren, was der Browser tut, müssen Sie die folgenden Schritte ausführen:

    1. Fordern Sie die Seite an.
    2. Speichern Sie die Sammlung von Cookies in eine Variable.
    3. Extrahiere den ViewState zu einer Variablen.
    4. Posten Sie mit den entsprechenden Formularwerten, indem Sie sowohl die gespeicherten Cookies als auch die ViewState-Informationen zusammen mit der Anfrage übergeben.

    Eine Menge Arbeit, die ich kenne, aber nicht allzu schrecklich schwierig. Auch hier kann dies nicht die einzige Quelle für Ihre Probleme sein, aber es lohnt sich zu lesen, um die Fehlersuche zu starten.

    Ich habe versucht, Mechanismen und Urllib2, und mechanisieren Handles Cookies besser. Ich kann das Formular einfach unter Angabe von Mechanismen einreichen:

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

    Es war nicht notwendig, die Postanforderung manuell zu replizieren, und die Mechanisierung in diesem Fall war in der Lage, ein Formular zu behandeln, das auf Javascript basiert.

    Python ist die beste Programmiersprache der Welt.