Làm thế nào tôi có thể thực hiện yêu cầu HTTP "tiếp tục hoạt động" bằng cách sử dụng urllib2 của Python?Python urllib2 với giữ sống
Trả lời
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.
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
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
R gốc và resp của bạn là cả hai loại
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
.210Tuy nhiên, bạn vẫn có thể nhận được phiên bản cuối cùng của keepalive.py đây:
Hoặc kiểm tra httplib 's HttpConnection.
đã hoạt động cho tôi ... –
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 –
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.
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ó.
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. –
@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 –
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 ... –
Đâ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
- 1. Python Urllib2 Cookiejar với Selenium
- 2. Ổ cắm Python - giữ ổ cắm còn sống?
- 3. Giao diện nguồn với Python và urllib2
- 4. Lỗi Python urllib2
- 5. Python: Urllib2 và OpenCV
- 6. JavaMail: Giữ IMAPFolder.idle() còn sống
- 7. urllib2 python (Transfer-Encoding: chunked)
- 8. python urllib2 urlopen phản ứng
- 9. Giữ kết nối Java Bluetooth còn sống
- 10. Xử lý rss chuyển hướng với Python/urllib2
- 11. Giữ công cụ dòng lệnh còn sống
- 12. giữ biến sống trong một hàm javascript
- 13. Điều chỉnh với urllib2
- 14. Python: urllib/urllib2/httplib nhầm lẫn
- 15. Python: Xử lý Javascript bằng urllib2?
- 16. Python urllib2 Tiêu đề phản hồi
- 17. Giữ một tiến trình con còn sống và tiếp tục đưa ra lệnh? Python
- 18. Python 3.2 Không thể nhập urllib2 (ImportError: Không có mô-đun tên urllib2)
- 19. Làm thế nào để tăng tốc độ urllib2 của Python khi thực hiện nhiều yêu cầu
- 20. Tại sao tôi nhận được urllib2.HTTPError với urllib2 và không có lỗi với urllib?
- 21. Giữ một dịch vụ WCF còn sống dưới IIS
- 22. Sử dụng lại HttpURLConnection để giữ phiên còn sống
- 23. Lỗi HTTP urllib2 429
- 24. python: urllib2 sử dụng giao diện mạng khác nhau
- 25. URL PythonLib/URLLib2 POST
- 26. Có urllib2 trong Python 2.6.1 hỗ trợ proxy qua https
- 27. SPDY có khác biệt so với http ghép kênh để giữ kết nối còn sống
- 28. Python urllib và urllib2 không mở URL localhost?
- 29. Python urllib2, xác thực HTTP cơ bản và tr.im
- 30. suối lớn tập tin nhị phân với urllib2 nộp
Cảm ơn David. Tôi đã cập nhật câu trả lời cho phù hợp. – msanders
Trang web mới: http://urlgrabber.baseurl.org/ –
Cảm ơn @Forest - Tôi hiện đã cập nhật liên kết trong câu trả lời. – msanders