Lưu ý: câu trả lời này đã lỗi thời. Các phiên bản mới hơn của requests
hỗ trợ nhận trực tiếp nội dung yêu cầu, như tài liệu trả lời của AntonioHerraizS .
Không thể lấy nội dung thô thực sự của yêu cầu requests
, vì nó chỉ xử lý các đối tượng cấp cao hơn, chẳng hạn như tiêu đề và loại phương thức . requests
sử dụng urllib3
để gửi yêu cầu, nhưng urllib3
cũng không xử lý dữ liệu thô - nó sử dụng httplib
. Đây là dấu vết ngăn xếp đại diện của một yêu cầu:
-> r= requests.get("http://google.com")
/usr/local/lib/python2.7/dist-packages/requests/api.py(55)get()
-> return request('get', url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/api.py(44)request()
-> return session.request(method=method, url=url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(382)request()
-> resp = self.send(prep, **send_kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(485)send()
-> r = adapter.send(request, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/adapters.py(324)send()
-> timeout=timeout
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(478)urlopen()
-> body=body, headers=headers)
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(285)_make_request()
-> conn.request(method, url, **httplib_request_kw)
/usr/lib/python2.7/httplib.py(958)request()
-> self._send_request(method, url, body, headers)
Bên trong httplib
máy móc, chúng ta có thể thấy các HTTPConnection._send_request
cách sử dụng gián tiếp HTTPConnection._send_output
, cuối cùng tạo ra yêu cầu thô và cơ thể (nếu nó tồn tại) và sử dụng HTTPConnection.send
để gửi chúng một cách riêng biệt. send
cuối cùng cũng đến được ổ cắm.
Vì không có móc nối để làm những gì bạn muốn, như là phương sách cuối cùng, bạn có thể vá khỉ httplib
để có được nội dung. Đó là một giải pháp dễ vỡ và bạn có thể cần điều chỉnh nó nếu httplib
bị thay đổi. Nếu bạn có ý định phân phối phần mềm bằng giải pháp này, bạn có thể muốn xem xét việc đóng gói httplib
thay vì sử dụng hệ thống, điều này thật dễ dàng, vì đây là mô-đun python thuần.
Than ôi, không có thêm ado, giải pháp:
import requests
import httplib
def patch_send():
old_send= httplib.HTTPConnection.send
def new_send( self, data ):
print data
return old_send(self, data) #return is not necessary, but never hurts, in case the library is changed
httplib.HTTPConnection.send= new_send
patch_send()
requests.get("http://www.python.org")
mang lại sản lượng:
GET / HTTP/1.1
Host: www.python.org
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/2.1.0 CPython/2.7.3 Linux/3.2.0-23-generic-pae