2012-10-30 7 views
16

This è il modulo che sto cercando di utilizzare e c'è un modulo che sto cercando di compilare automaticamente. La ragione per cui mi piacerebbe utilizzare Requests over Mechanize è che con Mechanize, devo caricare la pagina di accesso prima di poter compilare e inviare, mentre con Requests, posso saltare la fase di caricamento e passare direttamente a POSTing del messaggio (fiduciosamente). Fondamentalmente, sto cercando di fare in modo che il processo di login consumi meno banda possibile.Come simulare la richiesta di post HTTP usando il modulo Richieste Python?

La mia seconda domanda è, dopo il processo di login e il reindirizzamento, è possibile non scaricare completamente l'intera pagina, ma solo recuperare il titolo della pagina? Fondamentalmente, solo il titolo mi dirà se l'accesso è riuscito o meno, quindi voglio ridurre al minimo l'utilizzo della larghezza di banda.

Sono un po 'noob quando si tratta di richieste HTTP e quant'altro, quindi qualsiasi aiuto sarebbe apprezzato. Cordiali saluti, questo è per un progetto scolastico.

modifica La prima parte della domanda è stata esaudita. La mia domanda ora è per la seconda parte

+1

È possibile utilizzare Chrome ispettore per vedere quali valori vengono passati alla richiesta di posta creata dal browser e quindi passare da lì. – bossylobster

risposta

32

qualche esempio di codice:

import requests 

URL = 'https://www.yourlibrary.ca/account/index.cfm' 
payload = { 
    'barcode': 'your user name/login', 
    'telephone_primary': 'your password', 
    'persistent': '1' # remember me 
} 

session = requests.session() 
r = requests.post(URL, data=payload) 
print r.cookies 

Il primo passo è quello di guardare la pagina sorgente e identificare l'elemento form che viene presentato (uso Firebug/strumenti di Chrome/IE qualunque (o solo guardando la fonte)). Quindi trova gli elementi input e identifica gli attributi richiesti name (vedi sopra).

L'URL fornito ha un "Ricordami", che sebbene non abbia provato (perché non posso), implica che emetterà un cookie per un periodo di tempo per evitare ulteriori accessi - che i cookie siano conservati nello request.session.

poi basta usare session.get(someurl, ...) per recuperare le pagine ecc ...

+0

L'ho provato ma non mi è sembrato autenticare, anche se ha funzionato con Mechanize. Sai potrebbe essere sbagliato? ** modifica ** Scusa, in realtà ha funzionato. Ho appena fatto un refuso :) –

+0

Sei un vero toccasana. Pensavo che avrei dovuto guadare attraverso la merda del raffreddore tutto il giorno.Finito col prendere 15 minuti per fare 8 ore di download manuale! – Blairg23

+0

quindi come posso inviare un file? –

12

Per poter utilizzare l'autenticazione nel giro di richieste di ottenere o di una funzione posta semplicemente fornire l'argomento auth. Come questo:

response = requests.get(url, auth = ('username', 'password')) Fare riferimento alle richieste Authentication Documentation per vedere in dettaglio.

Utilizzando gli strumenti di sviluppo di Chrome è possibile esaminare gli elementi della pagina html che contiene il modulo che si desidera compilare e inviare. Per una spiegazione di come è fatto andare here. Puoi trovare i dati necessari per popolare l'argomento dei dati della tua richiesta. Se non sei preoccupato di verificare il certificato di sicurezza del sito a cui accedi, puoi anche specificarlo nell'elenco degli argomenti get.

Se la pagina html ha questi elementi da utilizzare per il modulo web della pubblicazione:

<textarea id="text" class="wikitext" name="text" cols="80" rows="20"> 
This is where your edited text will go 
</textarea> 
<input type="submit" id="save" name="save" value="Submit changes"> 

Poi il codice Python per inviare a questa forma è la seguente:

import requests 
from bs4 import BeautifulSoup 

url = "http://www.someurl.com" 

username = "your_username" 
password = "your_password" 

response = requests.get(url, auth=(username, password), verify=False) 

# Getting the text of the page from the response data  
page = BeautifulSoup(response.text) 

# Finding the text contained in a specific element, for instance, the 
# textarea element that contains the area where you would write a forum post 
txt = page.find('textarea', id="text").string 

# Finding the value of a specific attribute with name = "version" and 
# extracting the contents of the value attribute 
tag = page.find('input', attrs = {'name':'version'}) 
ver = tag['value'] 

# Changing the text to whatever you want 
txt = "Your text here, this will be what is written to the textarea for the post" 

# construct the POST request 
form_data = { 
    'save' : 'Submit changes' 
    'text' : txt 
} 

post = requests.post(url,auth=(username, password),data=form_data,verify=False) 
Problemi correlati