【问题标题】:Python code like curl类似 curl 的 Python 代码
【发布时间】:2011-04-27 18:10:45
【问题描述】:

在 curl 我这样做:

curl -u email:password http://api.foursquare.com/v1/venue.json?vid=2393749

我如何在 python 中做同样的事情?

【问题讨论】:

标签: python curl urllib2 pycurl


【解决方案1】:

如果使用human_curl,你可以写一些代码

将human_curl 导入为hurl

r = hurl.get('http://api.foursquare.com/v1/venue.json?vid=2393749', auth=('email','password'))

r.content 中的 JSON 数据

【讨论】:

    【解决方案2】:

    “问题可能是 Python 库,按照 HTTP 标准,首先发送未经身份验证的请求,然后只有当它通过 401 重试得到响应时,才会发送正确的凭据。如果 Foursquare 服务器不这样做”完全标准的身份验证”,那么这些库将无法工作。

    尝试使用标头进行身份验证:"

    取自Python urllib2 Basic Auth Problem

    import urllib2
    import base64
    
    req = urllib2.Request('http://api.foursquare.com/v1/venue.json?vid=%s' % self.venue_id)
    req.add_header('Authorization: Basic ',base64.b64encode('email:password'))
    res = urllib2.urlopen(req)
    

    【讨论】:

      【解决方案3】:

      我更愿意通过子进程运行命令行 curl。这避免了 python、pycurl 和 libcurl 的所有潜在版本匹配问题。观察到 pycurl 已经 2 年没有被触及,并且只被列为支持 Python 2.5,这让我很警惕。 ——约翰

         import subprocess
      
         def curl(*args):
              curl_path = '/usr/bin/curl'
              curl_list = [curl_path]
              for arg in args:
                  curl_list.append(arg)
              curl_result = subprocess.Popen(
                           curl_list,
                           stderr=subprocess.PIPE,
                           stdout=subprocess.PIPE).communicate()[0]
              return curl_result
      
          answer = curl('-u', 'email:password', 'http://api.foursquare.com/v1/venue.json?vid=2393749')
      

      【讨论】:

        【解决方案4】:

        使用pycurl

        有一个关于SO for tutorials的讨论

        一个典型的例子:

        import sys
        import pycurl
        
        class ContentCallback:
                def __init__(self):
                        self.contents = ''
        
                def content_callback(self, buf):
                        self.contents = self.contents + buf
        
        t = ContentCallback()
        curlObj = pycurl.Curl()
        curlObj.setopt(curlObj.URL, 'http://www.google.com')
        curlObj.setopt(curlObj.WRITEFUNCTION, t.content_callback)
        curlObj.perform()
        curlObj.close()
        print t.contents
        

        【讨论】:

        • 您可以使用pycurl,但这不是必需的。使用标准库是完全可能的。请参阅我上面链接的问题。
        【解决方案5】:

        这是pycurl 中的等价物:

        import pycurl
        from StringIO import StringIO
        
        response_buffer = StringIO()
        curl = pycurl.Curl()
        
        curl.setopt(curl.URL, "http://api.foursquare.com/v1/venue.json?vid=2393749")
        
        curl.setopt(curl.USERPWD, '%s:%s' % ('youruser', 'yourpassword'))
        
        curl.setopt(curl.WRITEFUNCTION, response_buffer.write)
        
        curl.perform()
        curl.close()
        
        response_value = response_buffer.getvalue()
        

        【讨论】:

          猜你喜欢
          • 2019-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多