web-dev-qa-db-fra.com

Python - faites une demande POST en utilisant Python 3 urllib)

J'essaie de faire une POST demande à la page suivante: http://search.cpsa.ca/PhysicianSearch

Afin de simuler un clic sur le bouton "Rechercher" sans remplir aucun formulaire, ce qui ajoute des données à la page. J'ai obtenu les informations d'en-tête POST en cliquant sur le bouton tout en regardant l'onglet réseau dans chrome outils de développement. La raison pour laquelle je publie ceci au lieu de simplement copier les solutions des autres problèmes similaires est que je pense que je n'ai peut-être pas obtenu les informations d'en-tête correctes. Est-il correctement formaté et ai-je saisi les bonnes informations? Je n'ai jamais fait de demande POST auparavant.

Voici ce que j'ai réussi à reconstituer:

import urllib.parse
import urllib.request


data = urllib.parse.urlencode({'Host': 'search.cpsa.ca', 'Connection': 'keep-alive', 'Content-Length': 23796,
                                     'Origin': 'http://search.cpsa.ca', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                     'Cahce-Control': 'no-cache', 'X-Requested-With': 'XMLHttpRequest',
                                     'X-MicrosoftAjax': 'Delta=true', 'Accept': '*/*',
                                     'Referer': 'http://search.cpsa.ca/PhysicianSearch',
                                     'Accept-Encoding': 'gzip, deflate',
                                     'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6',
                                     'Cookie': 'ASP.NET_SessionId=kcwsgio3dchqjmyjtwue402c; _ga=GA1.2.412607756.1459536682; _gat=1'})


url = "http://www.musi-cal.com/cgi-bin/query?%s"

data = data.encode('ascii')
with urllib.request.urlopen("http://search.cpsa.ca/PhysicianSearch", data) as f:
    print(f.read().decode('utf-8'))

Cette solution génère le code HTML de la page, mais pas avec les données que je voulais récupérer à partir de la demande POST.

12

Voilà comment vous le faites.

from urllib import request, parse
data = parse.urlencode(<your data dict>).encode()
req =  request.Request(<your url>, data=data) # this will make the method "POST"
resp = request.urlopen(req)
49
C Panda

Merci C Panda. Vous m'avez vraiment facilité l'apprentissage de ce module.

J'ai sorti le dictionnaire que l'on passe n'encode pas pour moi. J'ai dû faire un changement mineur -

from urllib import request, parse
import json

# Data dict
data = { 'test1': 10, 'test2': 20 }

# Dict to Json
# Difference is { "test":10, "test2":20 }
data = json.dumps(data)

# Convert to String
data = str(data)

# Convert string to byte
data = data.encode('utf-8')

# Post Method is invoked if data != None
req =  request.Request(<your url>, data=data)

# Response
resp = request.urlopen(req)
9
Centos Newbie

Le code ci-dessus a encodé la chaîne JSON avec quelques\"supplémentaires qui m'ont causé beaucoup de problèmes. Cela ressemble à une meilleure façon de le faire:

from urllib import request, parse

url = "http://www.example.com/page"

data = {'test1': 10, 'test2': 20}
data = parse.urlencode(data).encode()

req = request.Request(url, data=data)
response = request.urlopen(req)

print (response.read())
3
iphaaw