Как захватить вывод Curl из Python script

Я хочу найти информацию о веб-странице с помощью curl, но в Python до сих пор это:

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

Если я запустил это, он распечатает:

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

То, что я хочу сделать, сможет сопоставить 200 в нем с помощью регулярного выражения (мне не нужна помощь с этим), но я не могу найти способ преобразовать весь текст выше в строку, Как мне это сделать? Я попытался: info = os.system("curl --head www.google.com"), но info был просто 0.

Ответ 1

Попробуйте следующее:

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

Ответ 2

Попробуйте это, используя subprocess.Popen():

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

Как указано в документации :

Модуль подпроцесса позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать коды возврата. Этот модуль намерен заменить несколько других, более старых модулей и функций, таких как:

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

Ответ 3

По какой-то причине... Мне нужно использовать завиток (нет pycurl, httplib2...), может быть, это может помочь кому-то:

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

Ответ 4

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

Результат

{"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"}}

Ответ 5

Вы можете использовать библиотеку HTTP или клиентскую библиотеку http в Python вместо вызова команды curl. Фактически, есть библиотека curl, которую вы можете установить (если у вас есть компилятор на вашей ОС).

Другими вариантами являются httplib2 (рекомендуется), который является довольно полным клиентом протокола http, поддерживающим кеширование, а также просто httplib или библиотекой с именем Request.

Если вы действительно хотите просто запустить команду curl и записать ее вывод, вы можете сделать это с помощью Popen в встроенном модуле подпроцесса, описанном здесь: http://docs.python.org/library/subprocess.html

Ответ 6

Ну, есть более легкий для чтения, но более грязный способ сделать это. Вот он:

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.

Это должно работать правильно для ваших нужд.:)