2009-07-04 9 views
1

Die Busgesellschaft, die ich benutze läuft eine schreckliche Website (Hebrew, English), die eine einfache "From A nach B Fahrplan heute" Abfrage ein Alptraum machen. Ich vermute, dass sie versuchen, die Verwendung des kostspieligen SMS-Abfragesystems zu fördern.Automatisches Drücken einer "Senden" -Taste mit Python

Ich versuche, den gesamten Stundenplan von der Website zu ernten, indem Sie die Abfrage für jeden möglichen Punkt zu jedem möglichen Punkt, der Summe zu etwa 10k Abfragen zusammenfassen würde. Das Abfrageergebnis wird in einem Popup-Fenster angezeigt. Ich bin ziemlich neu in der Webprogrammierung, aber vertraut mit den grundlegenden Aspekten von Python.

  1. Was ist die eleganteste Art, die Seite zu parsen, wählen Sie einen Wert für ein Dropdown-Menü und drücken Sie "Senden" mit einem Skript?
  2. Wie gebe ich dem Programm den Inhalt des neuen Popups als Eingabe?

Vielen Dank!

Antwort

10

Twill ist eine einfache Skriptsprache für das Surfen im Internet. Es passiert zufällig ein python api.

twill is essentially a thin shell around the mechanize package. All twill commands are implemented in the commands.py file, and pyparsing does the work of parsing the input and converting it into Python commands (see parse.py). Interactive shell work and readline support is implemented via the cmd module (from the standard Python library).

Ein Beispiel einreichen aus dem oben verlinkten doc "Drücken":

from twill.commands import go, showforms, formclear, fv, submit 

go('http://issola.caltech.edu/~t/qwsgi/qwsgi-demo.cgi/') 
go('./widgets') 
showforms() 

formclear('1') 
fv("1", "name", "test") 
fv("1", "password", "testpass") 
fv("1", "confirm", "yes") 
showforms() 

submit('0') 
+0

Ich musste submit() nicht senden ('0') wegen FEHLER: HiddenControl-Instanz hat kein Attribut '_click'. siehe: lists.idyll.org/pipermail/twill/2006-August/000526.html – user391339

10

Ich würde vorschlagen, Sie mechanize verwenden. Hier ist ein Code-Schnipsel aus ihrer Seite, die zeigt, wie ein Formular einreichen:


import re 
from mechanize import Browser 

br = Browser() 
br.open("http://www.example.com/") 
# follow second link with element text matching regular expression 
response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1) 
assert br.viewing_html() 
print br.title() 
print response1.geturl() 
print response1.info() # headers 
print response1.read() # body 
response1.close() # (shown for clarity; in fact Browser does this for you) 

br.select_form(name="order") 
# Browser passes through unknown attributes (including methods) 
# to the selected HTMLForm (from ClientForm). 
br["cheeses"] = ["mozzarella", "caerphilly"] # (the method here is __setitem__) 
response2 = br.submit() # submit current form 

# print currently selected form (don't call .submit() on this, use br.submit()) 
print br.form 

7

Sie sehr selten zu wollen, tatsächlich „drücken Sie die Submit-Button“, anstatt zu machen GET oder POST-Anfragen an die Handler Ressource direkt. Sehen Sie sich den HTML-Code an, in dem sich das Formular befindet, und sehen Sie, welche Parameter er an welche URL sendet und ob es sich um die Methode GET oder POST handelt. Sie können diese Anfragen einfach mit urllib (2) erstellen.

+1

Das mechanize-Paket erspart Ihnen viele der langweiligen Details von "... sehen, welche Parameter gesendet werden ...". Twill macht mechanisiert und bietet ein höheres Abstraktionsniveau. – gimel