Ich versuche, eine asp.net-Seite zu scrapen, wo ich brauche, um durch die Elemente eine Liste von Elementen, die in einem Gridview-Steuerelement sind Seite. Ich habe noch nie asp.net verwendet, aber ich habe im Netz nach Hinweisen gesucht, aber jetzt habe ich eine Ziegelmauer getroffen. Die Seitenverknüpfungen sind in der Form:
javascript:__doPostBack('ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems','Page$2')
Ich versuche gerade, dies mit Mechanize in Python zum Laufen zu bringen. Ich versuchte zunächst die folgenden, in der Annahme, dass die VIEWSTATE-Variablen von Mechanize behandelt werden würde.
br.form.set_all_readonly(False)
br['__EVENTTARGET'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTARGUMENT'] = 'Page$2'
response = br.submit(name="ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$itemLocator$btnItemSearch")
html = br.response().read()
Mit Hilfe eines Netzwerkmonitors (Fiddler2) habe ich festgestellt, dass zwei weitere Variablen ausgefüllt wurden, also habe ich diese ebenfalls hinzugefügt:
br.select_form(nr=0)
br.form.new_control('hidden','ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1',attrs = dict(name='ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1'))
br.form.new_control('hidden','hiddenInputToUpdateATBuffer_CommonToolkitScripts',attrs = dict(name='hiddenInputToUpdateATBuffer_CommonToolkitScripts'))
br.form.new_control('hidden','__ASYNCPOST',attrs = dict(name='__ASYNCPOST'))
br.form.set_all_readonly(False)
br['hiddenInputToUpdateATBuffer_CommonToolkitScripts'] = '1'
br['__ASYNCPOST'] = 'TRUE'
br['ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$SearchResultsUpdatePanel|ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTTARGET'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTARGUMENT'] = 'Page$2'
response = br.submit(name="ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$itemLocator$btnItemSearch")
html = br.response().read()
In beiden Fällen ist die zurückgegebene HTML-Datei nur für Seite 1.
Ich denke, es gibt einige mögliche Probleme:
-
Ich bin mir nicht sicher, ob ich die Vorlage richtig mache. Auf der Seite gibt es mehrere Übermittlungsschaltflächen, und die Schaltfläche, nach der ich suche, ist die Schaltfläche "Suchen", mit der ich zuvor auf die erste Seite gekommen bin. Ich könnte mir vorstellen, dass deshalb die erste Seite angezeigt wird. Wenn ich br.submit() ohne einen Namen verwende, wird ein anderes Submit-Steuerelement verwendet, das Sie an einen anderen Ort führt.
-
Wenn Sie in einem Browser auf eine Seitenzahl klicken, wird das Gridview-Steuerelement aktualisiert, ohne dass die Seite neu geladen wird. Da ich kein Javascript ausführe, kann ich das vielleicht nicht erreichen, aber ich würde zumindest erwarten, dass ich in der Lage bin, die Daten aus der POST zurückzubekommen und diese zu analysieren.
Für jede Hilfe wären wir dankbar!