Seite 1 von 1

mechanize - Performanceprobleme

Verfasst: Samstag 14. März 2009, 11:23
von Snoda
Hallo Community,

seit einiger Zeit arbeite ich mit mechanize. Und eigentlich ist es ja quasi perfekt um im Web zu navigieren.

Aber jetzt stehe ich doch vor einem Problem bei dem ich nicht weiterkomme.

dabei handelt es sich um Geschwindigkeitsproblem. Ich muss 2 Formulare so zeitnah wie möglich hintereinander abschicken.
Wenn ich jetzt eines der beiden abschicke ist mechanize ja blockiert, bis die Antwort vom Server vollständig geladen ist. Damit vergeht ziemlich viel Zeit.

Händisch mache ich im Browser (opera) 2 Tabs auf und bereite beide Formulare die vor. dann klicke ich den "senden" Button und wechsel den Tab- noch ein klick. Damit brauche ich 1/5 der zeit.

Daher meine Frage: Kann ich das ähnlich mit mechanize realsieren?
beide Formulare gehören übrigens zu gleichen Sitzung - daher bin ich mir nicht sicher ob das eventuell mit threads zu realisieren ist (?)

Leider ist mir die OOP imer noch ein wenig suspekt :(

Gruß von einem ratsuchenden Snoda

Verfasst: Samstag 14. März 2009, 12:58
von Leonidas
Du kannst es mit zwei Threads machen, wenn mechanize blokiert. Du könntest die Sessiondaten kopieren, somit sollte es auch keine Probleme wegen Race-Conditions geben.

Verfasst: Samstag 14. März 2009, 13:30
von Snoda
Danke für die schnelle Antwort!
Ich hab ehrlich gesagt noch nie Threads gebraucht - daher stehe ich eben etwas ratlos davor.

Aber ehe ich euch weiter belästige werde ich mal ein wenig probieren.

Verfasst: Sonntag 15. März 2009, 21:19
von Snoda
Nach einigen Versuchen habe ich doch wieder Probleme :?

Im voraus muss ich dazu sagen dass es sich jeweils um 2 hintereinander geschaltete Formulare handelt. Im ersten werden gewisse Werte eingegeben - im 2. nur noch einmal der "OK"-Button gedrückt

Code: Alles auswählen

from mechanize import Browser
from threading import Thread
import time

class time_thread(Thread):
    def __init__(self, browserinstance):
        Thread.__init__(self)
        self.browser=browserinstance

    def run(self):
        self.browser.select_form(nr=0)
        self.browser.submit()
        print "done"

br=Browser()
br1=Browser()
br2=Browser()
# hier rufe ich im Browser "br" die Seite auf,
#erledige versch. andere Sachen und fülle Formular 1 aus
br1.set_response(br.response())
#im Browser "br" fülle ich Formular 2 aus
br2.set_response(br.response())
t1=time_thread(br1)
t2=time_thread(br2)

t1.start()
t2.start()
time.sleep(10)
Wenn ich threat 2 nicht starte, funktioniert es einwandfrei. Aber wenn ich beide starte stürzt der Interpreter einfach ab, nachdem das erste "done" dasteht.

Ich vermute ja dass es daran liegt, dass gewisse Objekte des Browsers keine Kopien sind, und deshalb Fehler durch gleichzeitigen Zugriff entstehen. Aber wie könnte ich eine Browsersitzung komplett kopieren?

Verfasst: Dienstag 14. April 2009, 12:57
von Snoda
Am einfachsten sollte sich das Problem doch lösen lassen, in dem ich mechanize veranlasse, keine neue Seite zu laden, sondern den Prozess nach dem Senden zu beenden, richtig?

Kann mir jemand sagen wo der richtige Zugriffspunkt ist? Ich hangel mich schon seit Tagen durch die Libs von mechanize, aber werde einfach nicht schlau daraus :(