web-dev-qa-db-fra.com

Envoi à un formulaire Web à l'aide de python

J'ai vu des questions comme celle-ci posées plusieurs fois mais aucune n'est utile

J'essaie de soumettre des données à un formulaire sur le Web, cinq demandes ont été essayées, et urllib et aucune n'ont fonctionné

par exemple, voici le code qui devrait rechercher la balise [python] sur SO:

import urllib
import urllib2

url = 'http://stackoverflow.com/'

# Prepare the data
values = {'q' : '[python]'}
data = urllib.urlencode(values)

# Send HTTP POST request
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)

html = response.read()

# Print the result
print html

pourtant, quand je l'exécute, je reçois le code HTML de la page d'accueil

voici un exemple d'utilisation des requêtes:

import requests

data= {
    'q': '[python]'
    }
r = requests.get('http://stackoverflow.com', data=data)

print r.text

même résultat! Je ne comprends pas pourquoi ces méthodes ne fonctionnent pas. Je les ai essayées sur divers sites sans succès. Si quelqu'un a réussi à le faire, montre-moi comment!

Merci beaucoup! 

21
Serial

Si vous souhaitez passer q en tant que paramètre dans l'URL à l'aide de requests , utilisez l'argument params et non pas data (voir Passing Parameters In URLs ):

r = requests.get('http://stackoverflow.com', params=data)

Ceci demandera https://stackoverflow.com/?q=%5Bpython%5D , ce qui n'est pas ce que vous recherchez.

Vous voulez vraiment POST en un form. Essaye ça:

r = requests.post('https://stackoverflow.com/search', data=data)

Ceci est essentiellement identique à GET -ting https://stackoverflow.com/questions/tagged/python , mais je pense que vous en aurez une idée.

29
Johnsyweb
import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
      'location' : 'Northampton',
      'language' : 'Python' }

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req) 
the_page = response.read()

Cela crée une demande POST avec les données spécifiées dans les valeurs. Nous avons besoin d’urllib pour encoder l’url puis urllib2 pour envoyer une requête.

11
Rashid Feroz

Mécaniser la bibliothèque à partir de python est également très utile, vous permettant même de soumettre des formulaires. Vous pouvez utiliser le code suivant pour créer un objet de navigateur et créer des demandes.

import mechanize,re
br = mechanize.Browser()
br.set_handle_robots(False)   # ignore robots
br.set_handle_refresh(False)  # can sometimes hang without this
br.addheaders = [('User-agent', 'Firefox')]             
br.open( "http://google.com" )
br.select_form( 'f' )
br.form[ 'q' ] = 'foo'
br.submit()
resp = None

for link in br.links():
    siteMatch = re.compile( 'www.foofighters.com' ).search( link.url )

    if siteMatch:
        resp = br.follow_link( link )
        break

content = resp.get_data()
print content
0
Harsh Gupta