2010-08-27 17 views
9

उन्होंने पायथन दस्तावेज में इसका उल्लेख नहीं किया। और हाल ही में मैं कुछ सामग्री निकालने के लिए urllib2.urlopen() का उपयोग करके साइट को रीफ्रेश कर रहा हूं, मुझे कभी-कभी पता चलता है कि जब मैं साइट urllib2.urlopen() को अद्यतन करता हूं तो नई सामग्री शामिल नहीं होती है। तो मुझे आश्चर्य है कि यह कहीं कैश सामान करता है, है ना?क्या urllib2.urlopen() कैश सामान है?

+0

वेब सर्वर कैश सामान भी। यह सामान्य अपराधी है। परिणाम पर शीर्षलेखों की जांच करें, और ** जानकारी (** 'को शामिल करने के लिए ** ** अपने प्रश्न को अपडेट करें। –

+0

@ एसएलओटी: "वेब सर्वर कैश सामान भी" क्या इसका मतलब यह है कि अगर मुझे urllib2.urlopen() का उपयोग करके अपडेट किए गए परिणाम नहीं मिलते हैं, तो मुख्य रूप से वेब सर्वर "जानते हैं" यह मुझे ताज़ा करता है और मुझे अपडेट नहीं करता है सामान? क्या हर बार जब मैं साइट रीफ्रेश करता हूं तो सर्वर को फिर से डेटा संचारित करने के लिए मजबूर करने का कोई तरीका है? – Shane

+0

जब तक आप वेब सर्वर के बारे में ** ** ** नहीं जानते हैं, तो आप वास्तव में नहीं जानते कि इसके कैश क्या हैं। इसमें कैशिंग के कई स्तर हो सकते हैं। यह गलत तरीके से कॉन्फ़िगर किया गया कैश हो सकता है।इसमें ऐसे पृष्ठ हो सकते हैं जो कैश रीफ्रेश करने के लिए जानकारी प्रदान न करें। सर्वर पक्ष पर बहुत कुछ गलत हो सकता है। –

उत्तर

9

तो मुझे आश्चर्य है कि यह कहीं कहीं कैश सामान करता है, है ना?

ऐसा नहीं है।

यदि आपको नया डेटा नहीं दिखाई देता है, तो इसके कई कारण हो सकते हैं। अधिकांश बड़ी वेब सेवाएं प्रदर्शन कारणों से सर्वर-साइड कैशिंग का उपयोग करती हैं, उदाहरण के लिए वार्निश और स्क्विड या एप्लिकेशन-स्तरीय कैशिंग जैसे कैशिंग प्रॉक्सी का उपयोग करना।

यदि समस्या सर्वर-साइड कैशिंग के कारण होती है, तो हमारे पास सर्वर को नवीनतम डेटा देने के लिए मजबूर करने का कोई तरीका नहीं है।


स्किड जैसे प्रॉक्सी को कैशिंग के लिए, चीज़ें अलग-अलग हैं। आमतौर पर, स्क्विड HTTP प्रतिक्रिया (response().info().headers) में कुछ अतिरिक्त शीर्षलेख जोड़ता है।

यदि आपको X-Cache या X-Cache-Lookup नामक हेडर फ़ील्ड दिखाई देता है, तो इसका मतलब है कि आप सीधे रिमोट सर्वर से कनेक्ट नहीं हैं, लेकिन एक पारदर्शी प्रॉक्सी के माध्यम से।

यदि आपके पास कुछ ऐसा है: X-Cache: HIT from proxy.domain.tld, इसका मतलब है कि आपको मिली प्रतिक्रिया कैश की गई है। इसके विपरीत X-Cache MISS from proxy.domain.tld है, जिसका अर्थ है कि प्रतिक्रिया ताजा है।

+0

धन्यवाद, अब मुझे पता है कि समस्या क्या है। – Shane

-2

मुझे यह विश्वास करना मुश्किल लगता है कि urllib2 कैशिंग नहीं करता है, क्योंकि मेरे मामले में, प्रोग्राम को पुनरारंभ करने पर डेटा को ताज़ा किया जाता है। यदि प्रोग्राम पुनरारंभ नहीं होता है, तो डेटा हमेशा के लिए कैश किया जाता है। फ़ायरफ़ॉक्स से वही डेटा पुनर्प्राप्त करने से कभी भी खराब डेटा नहीं मिलता है।

+2

urllib2 कैशिंग नहीं करता है। हो सकता है कि आप प्रॉक्सी का उपयोग कर रहे हों या वेब एप्लिकेशन स्वयं अस्थायी डेटा संग्रहीत कर रहा हो। –

5

बहुत पुराना सवाल है, लेकिन मुझे एक ही समस्या थी जिसने इस समाधान को हल नहीं किया।
मेरे मामले में मैं इस तरह उपयोगकर्ता-एजेंट धोखा किया था:

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

आशा इस मदद करता है किसी को भी ...

+0

धन्यवाद! एक ड्रोपल फ़ीड से JSON डाउनलोड करते समय एक ही समस्या थी। इसका आपके वास्तविक पायथन स्क्रिप्ट के साथ कुछ भी नहीं हो सकता है, बल्कि सर्वर से आप डेटा डाउनलोड कर रहे हैं। हमारे मामले में सर्वर उपयोगकर्ता एजेंट के आधार पर सामग्री कैश की गई सामग्री। –

0

आपका वेब सर्वर या एक HTTP प्रॉक्सी सामग्री को संचित किया जा सकता है। आप एक Pragma: no-cache अनुरोध हेडर जोड़कर कैशिंग अक्षम करने का प्रयास कर सकते हैं: आप परिवर्तन करते हैं तो

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

और ब्राउज़र से और urllib से व्यवहार का परीक्षण, यह एक बेवकूफ गलती करने के लिए आसान है। ब्राउज़र में आप लॉग इन हैं, लेकिन urllib.urlopen में आपका ऐप आपको हमेशा एक ही लॉगिन पेज पर रीडायरेक्ट कर सकता है, इसलिए यदि आप पेज आकार या अपने सामान्य लेआउट के शीर्ष को देखते हैं, तो आप सोच सकते हैं कि आपके परिवर्तनों का कोई प्रभाव नहीं है ।