Envío a un formulario web usando python

He visto preguntas como esta muchas veces pero ninguna es útil

Estoy tratando de enviar datos a un formulario en la web. He probado las solicitudes y urllib y ninguna han funcionado.

por ejemplo, aquí hay un código que debe buscar la etiqueta [python] en 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 

sin embargo, cuando lo ejecuto obtengo el código HTML de la página de inicio

Aquí hay un ejemplo de uso de peticiones:

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

mismo resultado No entiendo por qué estos métodos no funcionan. Los he probado en varios sitios sin éxito, así que si alguien lo ha hecho con éxito, ¡muéstrame cómo!

¡Muchas gracias!

Si desea pasar q como un parámetro en la URL usando requests , use el argumento params , no los data (vea Pasar parámetros en las URL ):

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

Esto solicitará https://stackoverflow.com/?q=%5Bpython%5D , que no es lo que está buscando.

Usted realmente quiere POST a un formulario . Prueba esto:

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

Esto es esencialmente lo mismo que GET -ting https://stackoverflow.com/questions/tagged/python , pero creo que obtendrás la idea de esto.

 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() 

Esto hace una solicitud POST con los datos especificados en los valores. necesitamos urllib para codificar la url y luego urllib2 para enviar una solicitud.

Mecanizar la biblioteca desde Python también es genial, ya que le permite enviar formularios. Puede utilizar el siguiente código para crear un objeto de navegador y crear solicitudes.

 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