2009-01-23 23 views

Trả lời

27

Có một số giải pháp (theo mặc định, chúng được loại bỏ). Dưới đây là ví dụ về sử dụng tùy chọn HEADERFUNCTION cho phép bạn chỉ ra hàm để xử lý chúng.

Các giải pháp khác là các tùy chọn WRITEHEADER (không tương thích với WRITEFUNCTION) hoặc đặt HEADER thành True để chúng được truyền với phần thân.

#!/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

Tôi muốn sử dụng tính năng này mà không phải truy xuất nội dung. Có cách nào để đạt được điều này? Nội dung của tôi lớn (1.4GB hoặc tương tự) và tôi chỉ cần biết kích thước chứ không phải nội dung. – Alfe

+0

@Alfe cố gắng thực hiện yêu cầu '' 'HEAD''' thay cho' '' GET''', một cái gì đó như '' 'c.setopt (pycurl.CUSTOMREQUEST," HEAD ")' '' – Serge

+0

Chà, đó là muộn theo dõi, nhưng cảm ơn bạn anyway. Nhưng bây giờ cách đây rất lâu… Có thể là tôi đã làm theo cách đó, nhưng thực sự, tôi không thể nhớ: -} – Alfe

1

này có thể hoặc có thể không phải là một thay thế cho bạn:

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

Anothr thay thế, sử dụng human_curl: pip 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

khi nhập 'human_curl' Tôi nhận được thông báo lỗi' ImportError: pycurl: libcurl link-tiume ssl baqckend (nss) là khác nhau từ thời gian biên dịch ssl phụ trợ (không/khác) ' –

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() 

Thêm bất kỳ setopts curl khác khi cần thiết/mong muốn, chẳng hạn như FOLLOWLOCATION.

+0

Điều này có vẻ là câu trả lời duy nhất mà chỉ lấy các tiêu đề. –

Các vấn đề liên quan