mechanize - Performanceprobleme

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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
Hello world!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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.
Hello world!
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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?
Hello world!
Snoda
User
Beiträge: 32
Registriert: Mittwoch 1. Februar 2006, 14:34

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 :(
Hello world!
Antworten