如何在Python中记录curl的响应?

时间:2014-08-22 22:29:21

标签: python json curl

import os
 os.system("curl --head http://somewebsite.com")

打印出来:

HTTP/1.1 200 OK
Server: MochiWeb/1.0
Date: Fri, 22 Aug 2014 22:24:54 GMT
Content-Type: application/json
Cache-Control: no-cache
Access-Control-Allow-Origin: *

因此,此链接以JSON格式返回流数据,如何在Python中记录响应?

1 个答案:

答案 0 :(得分:2)

你不应该这样做。我稍后会解释原因;首先,我将展示如何使其工作。你有三个问题,你必须解决所有问题。


正如curl联机帮助页所说:

  

-I, --head

     

(HTTP / FTP / FILE)仅获取HTTP标头! HTTP服务器具有HEAD命令,它只用于获取文档的标题。在FTP或FILE文件上使用时,curl仅显示文件大小和上次修改时间。

因此,您明确告诉curl要求服务器不要向您发送响应正文。要解决此问题,请不要发送--head

os.system("curl http://somewebsite.com")

正如os.system文档所说:

  

在Unix上,返回值是以wait()指定的格式编码的进程的退出状态...

     

在Windows上,返回值是运行命令后系统shell返回的值。

换句话说,你得到的只是退出代码 - 一个小整数。输出刚打印出来;没有办法记录它。要实际记录文本,请查看下一段:

  

subprocess模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。有关一些有用的配方,请参阅subprocess文档中的Replacing Older Functions with the subprocess Module部分。

按照该链接,它会在第一个示例中显示如何获取输出:使用check_output功能。请注意,您必须将该命令行转换为参数列表。 (你可以使用shell=True代替,但是没有充分的理由;所有的shell都会在这里为你做的就是挡路了。)

output = subprocess.check_output(["curl", "http://somewebsite.com"])

最后,默认情况下,curl将正文输出到标准输出 - 这很好,这就是你正在捕捉的东西 - 但它也会输出东西到stderr,其中可能包括进度表,标题等。 ,取决于各种情况。除非您想要捕获这些信息,或者只是将其转储供用户查看,否则您想告诉curl不要这样做。有关详细信息,请参阅上面链接的联机帮助页:

output = subprocess.check_output(["curl", "-q", "http://somewebsite.com"])

所以,这很有效。你为什么不想这样做?

因为有更好的方法可以做你想要的:urllib.request模块(或者,如果你使用的是Python 2.x,urllib2):

output = urllib.request.urlopen('http://www.somewebsite.com').read()

这怎么样更好?

  • Portable:适用于任何可以运行Python的系统,而不仅仅是安装了curl的系统。
  • 更简单:不需要为外部程序设计正确的参数,然后弄清楚如何从Python传递它们。
  • 更好的错误处理:您可以检查HTTP状态代码,而不是尝试解析curl给您的任何内容。
  • 更灵活:如果你想要,例如,分别获取标题和数据,你可以单独获取它们,而不必弄清楚如何让curl将标题转储到单独的管道Popen它来自Python并从两个管道中读取而没有死锁。
  • 更容易调试。