Utilizzando python per inviare un modulo web con liburl o richieste

Sto tentando di inviare un modulo sulla pagina Web e accedere all’html della pagina successiva dopo che il modulo è stato inviato. Ho trovato due modi per farlo usando entrambe le richieste o liburl.

import urllib import urllib2 import webbrowser url = 'https://fcq.colorado.edu/UCBdata.htm' def main(): data = urllib.urlencode({'subj': 'CSCI', 'crse': '1300'}) results = urllib2.urlopen(url, data) print results.read() with open("results.html", "w") as f: f.write(results.read()) webbrowser.open("results.html") return 0 if __name__ == '__main__': main() 

o:

 import requests url = 'https://fcq.colorado.edu/UCBdata.htm' def main(): payload = {'subj': 'CSCI', 'crse': '1300'} r = requests.post(url, payload) with open("requests_results.html", "w") as f: f.write(r.content) return 0 if __name__ == '__main__': main() 

Quando ottengo la pagina dopo la richiesta, è la stessa pagina che ha il modulo su entrambi i metodi. Mi stavo chiedendo se forse dovevo fare qualcosa con il pulsante di invio? Sono nuovo di roba web e python quindi qualsiasi suggerimento o idea sarebbe molto apprezzato. Grazie!

Ecco l’html del pulsante di invio:

Il modulo su quella pagina verrà effettivamente inviato da JavaScript, quindi solo l’elemento

non è (necessariamente) sufficiente. Puoi utilizzare, ad esempio, la scheda di rete di Firebug o gli strumenti di sviluppo di Chrome per ispezionare la richiesta POST dopo aver inviato il modulo per vedere cosa è effettivamente inviato.

Questo sembra funzionare:

 import requests url = 'https://fcq.colorado.edu/scripts/broker.exe' payload = { "_PROGRAM": "fcqlib.fcqdata.sas", "_SERVICE": "fcq", "camp": "BD", "fileFrmt": "HTM", "ftrm": "1", "fyr": "2007", "grp1": "ALL", "jjj": "mytst", "ltrm": "7", "lyr": "2013", "sort": "descending YEARTERM SUBJECT COURSE SECTION", } payload.update({ 'subj': 'CSCI', 'crse': '1300', }) def main(): r = requests.post(url, payload) with open("requests_results.html", "w") as f: f.write(r.content) return 0 if __name__ == '__main__': main() 

L’URL di destinazione del modulo è https://fcq.colorado.edu/scripts/broker.exe (vedere l’attributo action del tag

). Quindi è necessario sostituire:

 url = 'https://fcq.colorado.edu/UCBdata.htm' 

con

 url = 'https://fcq.colorado.edu/scripts/broker.exe' 

Non so se sei ancora interessato, ma in realtà ho fatto qualcosa di simile con lo stesso identico sito, e ho dovuto affrontare lo stesso identico problema. Ho usato la libreria Mechanize e Requests per creare una sorta di API di scraper Python.

Puoi vedere il mio codice per questo su github e accolgo qualsiasi richiesta di pull se pensi di poter fare qualcosa di meglio.