2012-04-15 38 views
10

que desee encontrar la información sobre una página web utilizando rizo, pero en Python, hasta ahora tengo esto:Cómo capturar salida de Curl de script Python

os.system("curl --head www.google.com") 

Si corro que, imprime:

HTTP/1.1 200 OK 
Date: Sun, 15 Apr 2012 00:50:13 GMT 
Expires: -1 
Cache-Control: private, max-age=0 
Content-Type: text/html; charset=ISO-8859-1 
Set-Cookie: PREF=ID=3e39ad65c9fa03f3:FF=0:TM=1334451013:LM=1334451013:S=IyFnmKZh0Ck4xfJ4; expires=Tue, 15-Apr-2014 00:50:13 GMT; path=/; domain=.google.com 
Set-Cookie: NID=58=Giz8e5-6p4cDNmx9j9QLwCbqhRksc907LDDO6WYeeV-hRbugTLTLvyjswf6Vk1xd6FPAGi8VOPaJVXm14TBm-0Seu1_331zS6gPHfFp4u4rRkXtSR9Un0hg-smEqByZO; expires=Mon, 15-Oct-2012 00:50:13 GMT; path=/; domain=.google.com; HttpOnly 
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." 
Server: gws 
X-XSS-Protection: 1; mode=block 
X-Frame-Options: SAMEORIGIN 
Transfer-Encoding: chunked 

lo que yo quiero hacer, es ser capaz de igualar el 200 en que el uso de una expresión regular (no necesito ayuda con eso), pero, no puedo encontrar una manera de convertir todo el texto arriba en una cadena. ¿Cómo puedo hacer eso? Intenté: info = os.system("curl --head www.google.com") pero info era solo 0.

+0

"El módulo de subprocesos proporciona instalaciones más potentes para engendrar nuevos procesos y recuperar sus resultados; es preferible usar este módulo para usar esta función. en Funciones anteriores con la sección Módulo de subprocesos en la documentación del subproceso para algunas recetas útiles. " -http: //docs.python.org/library/os.html#os.system –

Respuesta

2

Prueba esto:

import httplib 
conn = httplib.HTTPConnection("www.python.org") 
conn.request("GET", "/index.html") 
r1 = conn.getresponse() 
print r1.status, r1.reason 
+8

Esto realmente no responde la pregunta sobre cómo capturar la salida de curl. A menudo necesitas curl para enviar cookies específicas y otros parámetros. – 576i

17

Prueba de esto, el uso de subprocess.Popen():

import subprocess 
proc = subprocess.Popen(["curl", "--head", "www.google.com"], stdout=subprocess.PIPE) 
(out, err) = proc.communicate() 
print out 

Como se indica en la documentation:

El módulo subproceso le permite obtener nuevos procesos, conectarse a sus tuberías de entrada/salida/error, y obtener sus códigos de retorno. Este módulo tiene la intención de sustituir a varios otros, módulos y funciones más antiguos, como:

os.system 
os.spawn* 
os.popen* 
popen2.* 
commands.* 
+0

¿Por qué? Explique por favor – Billjk

+0

@ user1333973: Porque 'subprocess' funciona y' os.system() 'no. –

+0

@ user1333973 agregó un enlace a la documentación –

0

usted podría utilizar una biblioteca de HTTP o HTTP biblioteca cliente Python en lugar de llamar a un comando curl. De hecho, hay una biblioteca curl que puede instalar (siempre que tenga un compilador en su sistema operativo).

Otras opciones son httplib2 (recomendado) que es un cliente de protocolo http bastante completo que también admite el almacenamiento en caché, o simplemente httplib o una biblioteca llamada Solicitud.

Si realmente, realmente quiere simplemente ejecutar el comando curl y capturar su salida, entonces usted puede hacer esto con Popen en el módulo de subproceso incorporado documentado aquí: http://docs.python.org/library/subprocess.html

0

Bueno, hay una forma más fácil de leer, pero más desordenada para hacerlo. Aquí está:

import os 
outfile='' #put your file path there 
os.system("curl --head www.google.com>>{x}".format(x=str(outfile)) #Outputs command to log file (and creates it if it doesnt exist). 
readOut=open("{z}".format(z=str(outfile),"r") #Opens file in reading mode. 
for line in readOut: 
    print line #Prints lines in file 
readOut.close() #Closes file 
os.system("del {c}".format(c=str(outfile)) #This is optional, as it just deletes the log file after use. 

Esto debería funcionar correctamente para sus necesidades. :)

8

Por alguna razón ... necesito usar rizo (sin pycurl, httplib2 ...), tal vez esto puede ayudar a alguien:

import os 
result = os.popen("curl http://google.es").read() 
print result 
+2

Gracias, esto es más intuitivo que otras respuestas, útil para scripts sucios/creados rápidamente :) –

2
import os 
cmd = 'curl https://randomuser.me/api/' 
os.system(cmd) 

Resultado

{"results":[{"gender":"male","name":{"title":"mr","first":"çetin","last":"nebioğlu"},"location":{"street":"5919 abanoz sk","city":"adana","state":"kayseri","postcode":53537},"email":"çetin.nebioğ[email protected]","login":{"username":"heavyleopard188","password":"forgot","salt":"91TJOXWX","md5":"2b1124732ed2716af7d87ff3b140d178","sha1":"cb13fddef0e2ce14fa08a1731b66f5a603e32abe","sha256":"cbc252db886cc20e13f1fe000af1762be9f05e4f6372c289f993b89f1013a68c"},"dob":"1977-05-10 18:26:56","registered":"2009-09-08 15:57:32","phone":"(518)-816-4122","cell":"(605)-165-1900","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/men/38.jpg","medium":"https://randomuser.me/api/portraits/med/men/38.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/38.jpg"},"nat":"TR"}],"info":{"seed":"0b38b702ef718e83","results":1,"page":1,"version":"1.1"}} 
Cuestiones relacionadas