2009-10-12 11 views
21

Devo riempire i valori del modulo su una pagina di destinazione quindi fare clic su un pulsante tramite Python. Ho esaminato Selenium e Windmill, ma questi sono framework di test - non sto testando. Sto cercando di accedere a un sito Web di terze parti in modo programmatico, quindi scaricare e analizzare un file che dobbiamo inserire nel nostro database. Il problema con i framework di test è che lanciano istanze di browser; Voglio solo uno script che posso pianificare per eseguire ogni giorno per recuperare la pagina che voglio. Un modo per farlo?Compila i valori del modulo in una pagina Web tramite uno script Python (non test)

risposta

21

Siete alla ricerca di campione presentando Mechanize

Forma:

import re 
from mechanize import Browser 

br = Browser() 
br.open("http://www.example.com/") 
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__) 
response = br.submit() # submit current form 
+0

mi sono bloccato con Python 2.6, però, così tristemente Mechanize non è una scelta possibile. (GopherError è sceso in 2.6, sembra). – Habaabiai

+0

Mechanize doc è di solito un po 'laconico, ma funziona davvero molto bene! –

+0

Penso che dovresti insistere, prova a eseguire il debug del problema gopher. In python 2.6, il supporto gopher è stato rimosso IIRC, quindi il problema è probabilmente relativo al commento di alcune gopherlib di importazione e ai pochi punti in cui viene effettivamente utilizzato gopher. –

3

È possibile utilizzare il urllib libreria standard per farlo in questo modo:

import urllib 

urllib.urlretrieve("http://www.google.com/", "somefile.html", lambda x,y,z:0, urllib.urlencode({"username": "xxx", "password": "pass"})) 
1

L'esempio Mechanize come suggerito sembra lavorare. Nei campi di immissione in cui è necessario immettere il testo, usare qualcosa come:

br["kw"] = "rowling" # (the method here is __setitem__) 

Se qualche contenuto viene generato dopo aver inviato il modulo, come in un motore di ricerca, si ottiene tramite:

print response.read() 
12

Avere un'occhiata a questo esempio che utilizzano Mechanize: darà l'idea di base:

#!/usr/bin/python 
import re 
from mechanize import Browser 
br = Browser() 

# Ignore robots.txt 
br.set_handle_robots(False) 
# Google demands a user-agent that isn't a robot 
br.addheaders = [('User-agent', 'Firefox')] 

# Retrieve the Google home page, saving the response 
br.open("http://google.com") 

# Select the search box and search for 'foo' 
br.select_form('f') 
br.form[ 'q' ] = 'foo' 

# Get the search results 
br.submit() 

# Find the link to foofighters.com; why did we run a search? 
resp = None 
for link in br.links(): 
    siteMatch = re.compile('www.foofighters.com').search(link.url) 
    if siteMatch: 
     resp = br.follow_link(link) 
     break 

# Print the site 
content = resp.get_data() 
print content 
Problemi correlati