2010-08-27 18 views
9

Họ không đề cập đến điều này trong tài liệu python. Và gần đây tôi đang thử nghiệm một trang web chỉ cần làm mới trang web bằng cách sử dụng urllib2.urlopen() để trích xuất nội dung nhất định, tôi nhận thấy đôi khi khi tôi cập nhật trang web urllib2.urlopen() dường như không nhận được nội dung mới được thêm vào. Vì vậy, tôi tự hỏi nó có bộ nhớ đệm công cụ ở đâu đó, phải không?Công cụ bộ nhớ cache có phải là urllib2.urlopen() không?

+0

Công cụ lưu trữ trong bộ nhớ cache của máy chủ web. Đó là thủ phạm bình thường. Kiểm tra các tiêu đề trên kết quả, và ** cập nhật ** câu hỏi của bạn để bao gồm 'info()'. –

+0

@ S.Lott: "Các bộ nhớ cache của máy chủ web cũng vậy" Có nghĩa là nếu tôi không nhận được kết quả cập nhật bằng cách sử dụng urllib2.urlopen() chủ yếu là các máy chủ web "biết" đó là tôi làm mới và không cho tôi cập nhật đồ đạc? Có cách nào để buộc các máy chủ để truyền tải dữ liệu trên một lần nữa mỗi khi tôi làm mới trang web? – Shane

+0

Trừ khi bạn biết ** nhiều ** về máy chủ web, bạn không thực sự biết bộ nhớ cache của nó. Nó có thể có nhiều cấp độ bộ nhớ đệm. Nó có thể có bộ nhớ cache được cấu hình không chính xác.Nó có thể có các trang không cung cấp thông tin để làm mới bộ nhớ cache. Phần lớn có thể đi sai ở phía máy chủ. –

Trả lời

9

Vì vậy, tôi tự hỏi nó có bộ đệm ẩn ở đâu đó, phải không?

Không.

Nếu bạn không thấy dữ liệu mới, điều này có thể có nhiều lý do. Hầu hết các dịch vụ web lớn hơn đều sử dụng bộ nhớ đệm phía máy chủ cho các lý do hiệu suất, ví dụ như sử dụng proxy caching như Varnish và Squid hoặc bộ nhớ đệm cấp ứng dụng.

Nếu sự cố là do bộ nhớ đệm phía máy chủ gây ra, chúng tôi không có cách nào buộc máy chủ cung cấp cho bạn dữ liệu mới nhất.


Để lưu bộ nhớ cache proxy như mực, mọi thứ khác nhau. Thông thường, mực thêm một số tiêu đề bổ sung vào phản hồi HTTP (response().info().headers).

Nếu bạn thấy trường tiêu đề được gọi là X-Cache hoặc X-Cache-Lookup, điều này có nghĩa là bạn không được kết nối trực tiếp với máy chủ từ xa mà qua proxy trong suốt.

Nếu bạn có một cái gì đó như: X-Cache: HIT from proxy.domain.tld, điều này có nghĩa là phản hồi bạn nhận được được lưu vào bộ nhớ cache. Ngược lại là X-Cache MISS from proxy.domain.tld, có nghĩa là phản hồi là mới.

+0

Cảm ơn, bây giờ tôi biết vấn đề là gì. – Shane

-2

Tôi thấy khó tin rằng urllib2 không lưu vào bộ nhớ đệm, vì trong trường hợp của tôi, khi khởi động lại chương trình, dữ liệu được làm mới. Nếu chương trình không được khởi động lại, dữ liệu sẽ xuất hiện để được lưu trữ vĩnh viễn. Cũng lấy dữ liệu giống nhau từ Firefox không bao giờ trả về dữ liệu cũ.

+2

urllib2 không làm bộ đệm ẩn. có thể bạn đang sử dụng proxy hoặc chính ứng dụng web đang lưu trữ dữ liệu tạm thời. –

5

Câu hỏi rất cũ, nhưng tôi đã gặp phải sự cố tương tự mà giải pháp này không giải quyết được.
Trong trường hợp của tôi, tôi đã phải giả mạo User-Agent như thế này:

request = urllib2.Request(url) 
request.add_header('User-Agent', 'Mozilla/5.0') 
content = urllib2.build_opener().open(request) 

Hope this helps ai ...

+0

Cảm ơn! Đã có cùng một vấn đề khi tải xuống JSON từ nguồn cấp dữ liệu drupal. Điều này có thể không liên quan gì đến tập lệnh python thực tế của bạn, mà là máy chủ bạn đang tải xuống dữ liệu. Trong trường hợp của chúng tôi, nội dung được lưu trữ trên máy chủ dựa trên tác nhân người dùng. –

0

máy chủ web của bạn hoặc một proxy HTTP có thể được bộ nhớ đệm nội dung. Bạn có thể thử vô hiệu hóa bộ nhớ đệm bằng cách thêm một tiêu đề Pragma: no-cache yêu cầu:

request = urllib2.Request(url) 
request.add_header('Pragma', 'no-cache') 
content = urllib2.build_opener().open(request) 
0

Nếu bạn thực hiện thay đổi và kiểm tra hành vi từ trình duyệt và từ urllib, nó rất dễ dàng để thực hiện một sai lầm ngu ngốc. Trong trình duyệt bạn đã đăng nhập, nhưng trong urllib.urlopen, ứng dụng của bạn có thể chuyển hướng bạn đến cùng một trang đăng nhập, vì vậy nếu bạn chỉ thấy kích thước trang hoặc đầu bố cục chung, bạn có thể nghĩ rằng các thay đổi của bạn không có hiệu lực .

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