Una de las cosas a las que me he enfrentado hace poco es la necesidad de hacer un script en Python que requería realizar peticiones a una página Web para obtener información. Para ello he necesitado usar la librería Pycurl que es la encargada de realizar las peticiones mediante Curl en Python. Como necesitaba llamar muchas veces a Curl he creado una función que me ayude en el proceso y se obtenga un código más limpio:
Función Curl para Python
import pycurl, StringIO, random, time
# Variables
dev_null = StringIO.StringIO()
# Function que realiza las conexiones curl
def curl(args):
crCurl = pycurl.Curl();
sUrl = args.get( 'url', None );
sPostField = args.get( 'post', None );
ckCookie = args.get( 'cookie', None );
nHeader = args.get( 'header', 0 );
fcWrite = args.get( 'write', dev_null.write );
nTimeOut = args.get( 'time_out', 30 );
sAgent = args.get( 'agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8' );
sReferer = args.get( 'referer', '-' );
aReferer = args.get( 'aReferer', None );
aProxys = args.get( 'proxy', None );
nProxyTunel = args.get( 'proxy_tunel', 1 );
aHeader = args.get( 'http_header', [ 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg', 'Connection: Keep-Alive', 'Content-type: application/x-www-form-urlencoded;charset=UTF-8' ] );
nFollow = args.get( 'follow_location', 1 );
sUserPasswd = args.get( 'user_passwd', None );
if sUrl is None:
return false;
# Comprobamos si nos han pasado un array con referers para modificar el referer
if aReferer is not None:
# Referer aleatorio
nRandomRf = random.randint( 0, len( aReferer ) - 1 );
sReferer = aReferer[nRandomRf].replace( '[curl_text]', sReferer );
# Opciones
crCurl.setopt( crCurl.URL, sUrl );
crCurl.setopt( crCurl.HEADER, nHeader );
crCurl.setopt( crCurl.WRITEFUNCTION, fcWrite );
crCurl.setopt( crCurl.HTTPHEADER, aHeader );
crCurl.setopt( crCurl.CONNECTTIMEOUT, nTimeOut );
crCurl.setopt( crCurl.REFERER, sReferer );
crCurl.setopt( crCurl.USERAGENT, sAgent );
crCurl.setopt( crCurl.FOLLOWLOCATION, nFollow );
if sUserPasswd is not None:
crCurl.setopt( crCurl.USERPWD, sUserPasswd );
if aProxys is not None:
# Usamos random para ir cambiando entre los diferentes proxys, asi no realizamos las peticiones siempre con el mismo proxy
nRandom = random.randint( 0, len( aProxys ) - 1 );
crCurl.setopt( crCurl.HTTPPROXYTUNNEL, nProxyTunel );
crCurl.setopt( crCurl.PROXY, aProxys[nRandom] );
if sPostField is not None:
crCurl.setopt( crCurl.POST, 1 );
crCurl.setopt( crCurl.POSTFIELDS, sPostField );
if ckCookie is not None:
crCurl.setopt( crCurl.COOKIEJAR, ckCookie );
crCurl.setopt( crCurl.COOKIEFILE, ckCookie );
crCurl.perform()
# Comprobamos que la peticion es correcta, de no ser esperamos 10 segundos y volvemos a realizarla
if crCurl.getinfo( crCurl.HTTP_CODE ) != 200:
time.sleep(10);
curl(args);
Argumentos para la función CURL
| url: | Dirección donde se realizará la petición por CURL. |
| post: | Datos que se enviarán en una operación de tipo "HTTP POST". Debe ser pasado como una cadena 'para1 = val1 & para2 = val2 &...'. |
| cookie: | Dirección donde se guardará la cookie, si se añade sólo el nombre se guardara en el directorio donde se ejecute el Script. |
| header: | Mostrar la cabecera HTTP, por defecto 0. |
| write: | Función que servirá para pintar el HTML devuelto. Por defecto None. |
| time_out: | Tiempo de espera para la petición. Por defecto 30. |
| agent: | Contenido de "User-Agent:" para la cabecera en una petición HTTP. Por defecto 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8'. |
| referer: | Contenido de "Referer:" para la cabecera en una petición HTTP. Por defecto '-'. |
| aReferer: | Array con varios casos de 'Referer:'. Podríamos añadir todos las referencias de Google, Yahoo, etc. Así mostraría el referido como si viniera de unos de estos buscadores. Por defecto None. |
| proxy: | Array con varias IP de servidores Proxy. Por defecto None. |
| proxy_tunel: | Túnel a través de los Proxy HTTP que hemos pasado como argumento. Por defecto 1. |
| http_header: | Array con los campos para la petición HTTP. Por defecto [ 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg', 'Connection: Keep-Alive', 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'] |
| nFollow: | Seguir redirecciones HTTP. Por defecto 1 |
| user_passwd: | Usuario y contraseña que se usarán para la conexión, con el formato USUARIO:PASSWORD. Por defecto None. |
Ejemplo petición Curl ocultando referido
curl( { 'url': 'http://www.tu-web-aqui.com',
'referer': 'buscando a curl',
'aReferer': ['http://www.google.es/search?hl=es&safe=active&q=[curl_text]'] } )
Ejemplo de Login con Curl
curl( {'url': 'URL_LOGIN',
'post': 'signin[username]=usuario&signin[password]=contraseña',
'cookie': 'cookie_curl'} )
Ejemplo para HTML con Curl
def pintar(response):
print(response);
curl( { 'url': 'http://www.tu-web-aqui.com', 'write': pintar } )
Cambiar estado de Twitter mediante Curl
curl({ 'url' : 'http://twitter.com/statuses/update.json',
'post' : 'status=Hola desde Python!',
'user_passwd' : 'usuario:password'
});
Una simple función Curl para python que nos ayudará a la hora de desarrollar scripts que necesiten realizar muchas peticiones.
-
Añadir icono dentro de un Input Publicado por Sampedro el día 10/03/2010
Guardado en CSS -
Mostrar estadísticas de Google Analitycs en nuestra web Publicado por Sergio el día 05/03/2010
Guardado en Desarrollo, Google -
Warning: PDO [2002] Argumento inválido Publicado por Sampedro el día 02/03/2010
Guardado en Desarrollo -
CheatSheet para Wordpress Publicado por Sampedro el día 22/02/2010
Guardado en Desarrollo, Themes, Wordpress -
Reportar bug en Chrome o Chromium para ganar dinero Publicado por Sampedro el día 18/02/2010
Guardado en Ganar dinero