web-dev-qa-db-fra.com

Comment simuler une requête de publication HTTP en utilisant Python Module de requêtes?

This 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 des requêtes sur Mechanize est parce qu'avec Mechanize, je dois d'abord charger la page de connexion avant de pouvoir la remplir et la soumettre, tandis qu'avec les requêtes, je peux ignorer l'étape de chargement et passer directement à la publication du message (j'espère). Fondamentalement, j'essaie de faire en sorte que le processus de connexion consomme le moins de bande passante possible.

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

Je suis en quelque sorte un noob en ce qui concerne les requêtes HTTP et ainsi de suite, donc toute aide serait appréciée. Pour info, c'est pour un projet d'école.

edit La première partie de la question a été répondue. Ma question est maintenant pour la deuxième partie

20
Display Name

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 à consulter votre page source et à identifier l'élément form qui est soumis (utilisez les outils Firebug/Chrome/IE (ou regardez simplement la source)). Recherchez ensuite les éléments input et identifiez les attributs name requis (voir ci-dessus).

L'URL que vous avez fournie se trouve avoir un "Remember Me", qui bien que je n'aie pas essayé (parce que je ne peux pas), implique qu'il émettra un cookie pendant un certain temps pour éviter d'autres connexions - que les cookies sont conservés dans le request.session.

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

36
Jon Clements

Pour utiliser l'authentification dans une fonction get ou post de requêtes, vous devez simplement fournir l'argument auth. Comme ça:

response = requests.get(url, auth = ('username', 'password')) Référez-vous aux demandes Documentation d'authentification pour des informations plus détaillées.

En utilisant les outils de développement de Chrome, vous pouvez inspecter les éléments de votre page html contenant le formulaire que vous souhaitez remplir et envoyer. Pour une explication de la façon dont cela se fait, allez ici . Vous pouvez trouver les données dont vous avez besoin pour remplir l'argument de données de votre demande de publication. Si vous n'êtes pas inquiet de vérifier le certificat de sécurité du site auquel vous accédez, vous pouvez également le spécifier dans la liste d'arguments get.

Si votre page html a ces éléments à utiliser pour votre publication de 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">

Ensuite, le code python à publier 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
Moot