Comment simuler une requête HTTP post en utilisant le module requêtes Python?

est le module que j'essaie d'utiliser et il y a un formulaire que j'essaie de remplir automatiquement. La raison pour laquelle j'aimerais utiliser les requêtes plutôt que Mechanize est qu'avec Mechanize, je dois d'abord charger la page de connexion avant de pouvoir la remplir et la soumettre, tandis que pour les requêtes, je peux sauter l'étape de chargement et aller directement à la publication du message (espérons). En gros, j'essaie de rendre le processus d'ouverture de session consommer de la bande passante.

mon second la question Est, après le processus de connexion et la redirection, est-il possible de ne pas télécharger entièrement la page entière, mais de récupérer seulement le titre de la page? Fondamentalement, le titre seul me dira si le login a réussi ou pas, donc je veux minimiser l'utilisation de la bande passante.

je suis un peu un noob quand il s'agit de requêtes HTTP et autres, donc toute aide serait appréciée. Pour info, c'est pour un projet scolaire.

modifier on a répondu à la première partie de la question. Ma question est maintenant pour la deuxième partie

19
demandé sur Jeremy Banks 2012-10-31 01:35:32

2 réponses

un exemple de code:

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

la première étape consiste à regarder la page source et à identifier le form élément soumis (utiliser les outils Firebug/Chrome/IE, peu importe (ou simplement regarder la source)). Ensuite, trouver le input éléments et d'en identifier les requis name attributs (voir ci-dessus).

L'URL que vous avez fourni se trouve avoir un "Se souvenir de moi", ce qui bien que je n'ai pas essayé( parce que je ne peux pas), implique qu'il émettra un cookie pour une période de temps pour évitez d'autres logins -- que les cookies sont conservés dans le request.session.

utilisez session.get(someurl, ...) pour récupérer des pages etc...

35
répondu Jon Clements 2012-10-30 21:51:41

pour utiliser l'authentification dans une fonction requests get ou post, vous n'avez qu'à fournir le auth argument. Comme ceci:

response = requests.get(url, auth = ('username', 'password')) Reportez-vous à la Demande Documentation Authentification pour plus d'informations.

à l'Aide de Chrome developer tools, vous pouvez inspecter les éléments de votre page html qui contient le formulaire que vous souhaitez remplir et soumettre. Pour une explication de la façon dont c'est fait aller ici. Vous pouvez trouver les données que vous avez besoin de peupler l'argument de données de votre requête de poteau. Si vous n'êtes pas inquiet de vérifier le certificat de sécurité du site auquel vous accédez, alors vous pouvez également spécifier cela dans la liste d'arguments get.

si votre page html contient ces éléments à utiliser pour l'affichage de votre formulaire web:

<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">

alors le code python à poster sur ce formulaire est le suivant:

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)
13
répondu Moot 2017-03-20 10:18:21