2009-06-24 37 views

Trả lời

30

Sử dụng thư viện urlgrabber. Điều này bao gồm một bộ xử lý HTTP cho urllib2 hỗ trợ HTTP 1.1 và keepalive:

>>> import urllib2 
>>> from urlgrabber.keepalive import HTTPHandler 
>>> keepalive_handler = HTTPHandler() 
>>> opener = urllib2.build_opener(keepalive_handler) 
>>> urllib2.install_opener(opener) 
>>> 
>>> fo = urllib2.urlopen('http://www.python.org') 

Lưu ý: bạn nên sử dụng phiên bản urlgrabber 3.9.0 hoặc sớm hơn, như các mô-đun keepalive đã được gỡ bỏ trong phiên bản 3.9.1

Có a port mô-đun keepalive cho Python 3.

+0

Cảm ơn David. Tôi đã cập nhật câu trả lời cho phù hợp. – msanders

+0

Trang web mới: http://urlgrabber.baseurl.org/ –

+0

Cảm ơn @Forest - Tôi hiện đã cập nhật liên kết trong câu trả lời. – msanders

4

Lưu ý rằng urlgrabber không hoạt động hoàn toàn với python 2.6. Tôi đã khắc phục các vấn đề (tôi nghĩ) bằng cách thực hiện các sửa đổi sau trong keepalive.py.

Trong keepalive.HTTPHandler.do_open() loại bỏ này

 if r.status == 200 or not HANDLE_ERRORS: 
     return r 

Và chèn này

 if r.status == 200 or not HANDLE_ERRORS: 
     # [speedplane] Must return an adinfourl object 
     resp = urllib2.addinfourl(r, r.msg, req.get_full_url()) 
     resp.code = r.status 
     resp.msg = r.reason 
     return resp 
+0

Cảm ơn nhưng nó sẽ được tốt đẹp nếu bạn giải thích những gì cố định này thay vì bình luận được gắn thẻ vô dụng. – 2371

+0

R gốc và resp của bạn là cả hai loại và cả hai đều có cùng thuộc tính. addinfourl nói "lớp để thêm thông tin() và geturl() phương pháp cho một tập tin mở." nhưng bản gốc đã có thông tin() và geturl(). Không thể làm việc ra lợi ích. – 2371

4

Thật không may keepalive.py đã bị xóa khỏi urlgrabber vào ngày 25 tháng 9 năm 2009 bởi sự thay đổi sau đây sau khi urlgrabber là thay đổi để phụ thuộc vào pycurl (hỗ trợ giữ sống):

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94

.210

Tuy nhiên, bạn vẫn có thể nhận được phiên bản cuối cùng của keepalive.py đây:

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

7

Hoặc kiểm tra httplib 's HttpConnection.

+0

đã hoạt động cho tôi ... –

+1

cách bật tính năng giữ kết nối cho HTTPConnection? Tôi đã thử thêm 'Kết nối: Giữ-Alive' cho cả hai yêu cầu và tiêu đề phản hồi, nhưng' httplib' vẫn kết nối lại trên mỗi yêu cầu –

11

Hãy thử urllib3 trong đó có các tính năng sau:

  • Tái sử dụng kết nối ổ cắm tương tự cho nhiều yêu cầu (HTTPConnectionPool và HTTPSConnectionPool) (với xác minh giấy chứng nhận client-side không bắt buộc).
  • Đăng tệp (encode_multipart_formdata).
  • Chuyển hướng và thử lại được tích hợp sẵn (tùy chọn).
  • Hỗ trợ giải nén và giải mã.
  • An toàn chủ đề và an toàn cho chủ đề.
  • Nhỏ và dễ hiểu codebase hoàn hảo để mở rộng và xây dựng dựa trên. Để có giải pháp toàn diện hơn, hãy xem Yêu cầu.

hoặc một giải pháp toàn diện hơn - Requests - hỗ trợ giữ-sống từ version 0.8.0 (bằng cách sử dụng urllib3 nội bộ) và có những điều sau features:

  • ĐẦU Vô cùng đơn giản, GET, POST , PUT, PATCH, DELETE yêu cầu.
  • Hỗ trợ Gevent cho Yêu cầu không đồng bộ.
  • Phiên có kiên trì cookie.
  • Hỗ trợ xác thực cơ bản, thông báo và xác thực tùy chỉnh.
  • Mã hóa từ điển tự động của từ điển
  • Giao diện từ điển đơn giản cho cookie yêu cầu/phản hồi.
  • Tải lên nhiều tệp.
  • Tự động giải mã Unicode, gzip và giảm phản hồi.
  • Hỗ trợ đầy đủ cho URL và tên miền unicode.
4

Vui lòng tránh đau tập thể và sử dụng Requests để thay thế. Nó sẽ làm điều đúng theo mặc định và sử dụng keep-alive nếu có.

+0

Tôi đang làm việc trên một số xác thực NTLM và thư viện Yêu cầu NTLM không hoạt động chính xác cho nó. Tuy nhiên, thư viện NTLM urllib2 không hoạt động chính xác. Câu hỏi này là do đó hữu ích cho tôi. –

+0

@JeffersonHudson, tôi không biết điều đó. Bạn có thể có may mắn hơn với https://github.com/requests/requests-ntlm –

+1

Tôi đã đề xuất các yêu cầu trong câu trả lời của tôi được đăng hơn một năm trước câu trả lời này ... –

0

Đây là urlopen hơi tương tự() không hoạt động, mặc dù không phải là luồng an toàn.

try: 
    from http.client import HTTPConnection, HTTPSConnection 
except ImportError: 
    from httplib import HTTPConnection, HTTPSConnection 
import select 
connections = {} 


def request(method, url, body=None, headers={}, **kwargs): 
    scheme, _, host, path = url.split('/', 3) 
    h = connections.get((scheme, host)) 
    if h and select.select([h.sock], [], [], 0)[0]: 
     h.close() 
     h = None 
    if not h: 
     Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection 
     h = connections[(scheme, host)] = Connection(host, **kwargs) 
    h.request(method, '/' + path, body, headers) 
    return h.getresponse() 


def urlopen(url, data=None, *args, **kwargs): 
    resp = request('POST' if data else 'GET', url, data, *args, **kwargs) 
    assert resp.status < 400, (resp.status, resp.reason, resp.read()) 
    return resp 
Các vấn đề liên quan