Tôi đang viết một ứng dụng web sử dụng một số API web của bên thứ ba và tôi muốn theo dõi yêu cầu và phản hồi ở mức độ thấp để phân tích quảng cáo. Vì vậy, tôi đang tìm một công thức sẽ nhận được urllib2 của Python để ghi lại tất cả các byte được truyền qua HTTP. Có lẽ một Handler phân lớp?Làm cách nào để nhận urllib2 ghi lại TẤT CẢ byte đã chuyển
Trả lời
Vâng, tôi đã tìm thấy làm thế nào để thiết lập được xây dựng trong cơ chế gỡ lỗi của thư viện:
import logging, urllib2, sys
hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh)
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)
Nhưng tôi vẫn đang tìm kiếm một cách để đổ tất cả các thông tin được chuyển giao.
Điều này có vẻ khá phức tạp để thực hiện. Không có móc trong urllib2, urllib, hoặc httplib (mà điều này được xây dựng trên) để chặn dữ liệu đầu vào hoặc đầu ra.
Điều duy nhất xảy ra với tôi, ngoài việc chuyển đổi chiến thuật để sử dụng công cụ bên ngoài (trong đó có rất nhiều người sử dụng), sẽ viết một phân lớp của socket.socket vào module (nói, "capture_socket") và sau đó chèn vào httplib bằng cách sử dụng "import capture_socket; import httplib; httplib.socket = capture_socket". Bạn sẽ phải sao chép tất cả các tham chiếu cần thiết (bất kỳ thứ gì của biểu mẫu "socket.foo" được sử dụng trong httplib) vào mô-đun của riêng bạn, nhưng sau đó bạn có thể ghi đè các thứ như recv() và sendall() trong lớp con của bạn để làm những gì bạn thích với dữ liệu.
Các biến chứng có thể xảy ra nếu bạn đang sử dụng SSL và tôi không chắc liệu điều này có đủ hay không hoặc bạn cũng phải tự tạo socket._fileobject của riêng mình. Nó xuất hiện doable mặc dù, và perusing nguồn trong httplib.py và socket.py trong thư viện chuẩn sẽ cho bạn biết thêm.
+1 Câu hỏi python rất đẹp được hỏi gần 2 năm trước mà không có upvotes. Nó thực sự kỳ quặc. Tôi đang tìm một câu trả lời cho bản thân mình. Tuy nhiên, trong trường hợp của tôi, tôi chỉ quan tâm đến các tiêu đề HTTP. –