2009-01-23 21 views
21

साथ शीर्ष लेख को पढ़ने के लिए मैं कैसे पढ़ा करते हैं प्रतिक्रिया हेडर एक PyCurl अनुरोध से लौटे?कैसे pycurl

उत्तर

27

कई समाधान कर रहे हैं (डिफ़ॉल्ट रूप से, वे गिरा दिया जाता है)। यहाँ विकल्प HEADERFUNCTION जो आप उन्हें संभालने के लिए एक समारोह का संकेत देता है का उपयोग कर एक उदाहरण है।

अन्य समाधान विकल्प हैं WRITEHEADER ( WRITEFUNCTION के साथ संगत नहीं) या हेडर को सही पर सेट करना ताकि वे शरीर के साथ प्रसारित हो जाएं।

#!/usr/bin/python 

import pycurl 
import sys 

class Storage: 
    def __init__(self): 
     self.contents = '' 
     self.line = 0 

    def store(self, buf): 
     self.line = self.line + 1 
     self.contents = "%s%i: %s" % (self.contents, self.line, buf) 

    def __str__(self): 
     return self.contents 

retrieved_body = Storage() 
retrieved_headers = Storage() 
c = pycurl.Curl() 
c.setopt(c.URL, 'http://www.demaziere.fr/eve/') 
c.setopt(c.WRITEFUNCTION, retrieved_body.store) 
c.setopt(c.HEADERFUNCTION, retrieved_headers.store) 
c.perform() 
c.close() 
print retrieved_headers 
print retrieved_body 
+0

मैं सामग्री को पुनः प्राप्त करने के लिए बिना इस का उपयोग करना चाहते हैं। क्या इसको हासिल करने के लिए कोई रास्ता है? मेरी सामग्री बड़ी है (1.4 जीबी या इसी तरह की), और मुझे केवल आकार को जानने की जरूरत है, सामग्री नहीं। – Alfe

+0

@Alfe बनाने के लिए '' '' बजाय का HEAD''' अनुरोध कोशिश '' GET''', '' 'c.setopt (pycurl.CUSTOMREQUEST," सिर ")' की तरह कुछ '' – Serge

+0

वाह, यह एक देर हो चुकी है अनुवर्ती, लेकिन वैसे भी धन्यवाद। लेकिन अब यह तो बहुत पहले है ... ठीक है, हो सकता है कि मैं इसे इस तरह से किया था, लेकिन वास्तव में, मुझे याद नहीं कर सकते हैं: -} – Alfe

1

यह हो सकता है या आप के लिए एक विकल्प नहीं हो सकता है:

import urllib 
headers = urllib.urlopen('http://www.pythonchallenge.com').headers.headers 
6

Anothr वैकल्पिक, human_curl उपयोग: human_curl पिप

In [1]: import human_curl as hurl 

In [2]: r = hurl.get("http://stackoverflow.com") 

In [3]: r.headers 
Out[3]: 
{'cache-control': 'public, max-age=45', 
'content-length': '198515', 
'content-type': 'text/html; charset=utf-8', 
'date': 'Thu, 01 Sep 2011 11:53:43 GMT', 
'expires': 'Thu, 01 Sep 2011 11:54:28 GMT', 
'last-modified': 'Thu, 01 Sep 2011 11:53:28 GMT', 
'vary': '*'} 
+0

जब 'आयात करने human_curl' मैं कह' ImportError त्रुटि हो रही है: pycurl: libcurl लिंक-tiume ssl baqckend (एनएसएस) संकलित समय एसएसएल बैकएंड से अलग है (कोई नहीं/अन्य) ' –

8
import pycurl 
from StringIO import StringIO 

headers = StringIO() 

c = pycurl.Curl() 
c.setopt(c.URL, url) 
c.setopt(c.HEADER, 1) 
c.setopt(c.NOBODY, 1) # header only, no body 
c.setopt(c.HEADERFUNCTION, headers.write) 

c.perform() 

print headers.getvalue() 

आवश्यक के रूप में किसी अन्य कर्ल setopts जोड़े/वांछित, जैसे कि FOLLOWLOCATION।

+0

ऐसा एकमात्र उत्तर लगता है जो केवल हेडर लाता है। –

संबंधित मुद्दे