संपादित: मुझे एहसास हुआ कि नहीं था तुम सिर्फ अपनी स्क्रिप्ट के साथ समस्या यह देख रहे थे। यहां मुझे लगता है कि समस्या क्या है, इसके बाद मेरे मूल उत्तर के बाद जो आप हल करने की कोशिश कर रहे बड़ी समस्या के लिए एक और दृष्टिकोण को संबोधित करते हैं।
आपकी स्क्रिप्ट एक कंबल except
कथन का उपयोग करने के खतरों का एक बड़ा उदाहरण है: आप सब कुछ पकड़ते हैं। इस मामले में, आपके sys.exit(0)
सहित।
मुझे लगता है कि आप try
ब्लॉक हैं जहां D:\Download\htmlString.p
अभी तक मौजूद नहीं है।
import sys
import pickle
import urllib2
request = urllib2.Request('http://www.iana.org/domains/example/')
response = urllib2.urlopen(request) # Make the request
htmlString = response.read()
try:
file = pickle.load(open('D:\\Download\\htmlString.p', 'rb'))
if file == htmlString:
print("Values haven't changed!")
sys.exit(0)
else:
pickle.dump(htmlString, open('D:\\Download\\htmlString.p', "wb"))
print('Saving')
except IOError:
pickle.dump(htmlString, open('D:\\Download\\htmlString.p', "wb"))
print('Created new file.')
एक पक्ष नोट के रूप में: यह त्रुटि IOError
कहा जाता है, और आप except IOError:
यहाँ अपनी स्क्रिप्ट के साथ साथ यह जाना बनाने के लिए पहले कोड का एक सा है के साथ विशेष रूप से इसे पकड़ कर सकते हैं, अपने except
जारी करने के लिए तय , आप अपने फ़ाइल पथों के लिए os.path
का उपयोग करने पर विचार कर सकते हैं - यह बाद में किसी भी प्लेटफ़ॉर्म पर आपकी स्क्रिप्ट का उपयोग करना चाहता है, और यह आपको बदसूरत डबल बैक-स्लेश बचाता है।
संपादित करें 2: अपने विशिष्ट यूआरएल के लिए अनुकूलित।
उस पृष्ठ के विज्ञापनों के लिए गतिशील रूप से जेनरेट की गई संख्या है जो प्रत्येक पृष्ठ लोड के साथ बदलती है। यह सभी सामग्री के बाद अंत में सही है, इसलिए हम उस बिंदु पर केवल HTML स्ट्रिंग को विभाजित कर सकते हैं और गतिशील संख्या के साथ भाग को छोड़कर पहली छमाही ले सकते हैं।
import sys
import pickle
import urllib2
request = urllib2.Request('http://ecal.forexpros.com/e_cal.php?duration=weekly')
response = urllib2.urlopen(request) # Make the request
# Grab everything before the dynabic double-click link
htmlString = response.read().split('<iframe src="http://fls.doubleclick')[0]
try:
file = pickle.load(open('D:\\Download\\htmlString.p', 'r'))
if pickle.load(open('D:\\Download\\htmlString.p', 'r')) == htmlString:
print("Values haven't changed!")
sys.exit(0)
else:
pickle.dump(htmlString, open('D:\\Download\\htmlString.p', "w"))
print('Saving')
except IOError:
pickle.dump(htmlString, open('D:\\Download\\htmlString.p', "w"))
print('Created new file.')
आपका स्ट्रिंग नहीं एक वैध HTML दस्तावेज है कि अब और अगर महत्वपूर्ण था है। अगर ऐसा होता है, तो आप उस रेखा या कुछ को हटा सकते हैं। ऐसा करने का शायद एक और शानदार तरीका है, - शायद एक रेगेक्स के साथ संख्या को हटा रहा है - लेकिन यह कम से कम आपके प्रश्न को संतुष्ट करता है।
मूल उत्तर - आपकी समस्या के लिए एक वैकल्पिक दृष्टिकोण।
वेब सर्वर से प्रतिक्रिया शीर्षलेख कैसा दिखते हैं? HTTP Last-Modified
प्रॉपर्टी निर्दिष्ट करता है जिसका उपयोग आप यह जांचने के लिए कर सकते हैं कि सामग्री बदल गई है या नहीं (मान लीजिए कि सर्वर सत्य बताता है)। यूके ने अपने उत्तर में दिखाए गए अनुरोध के रूप में HEAD
अनुरोध के साथ इसका उपयोग करें। यदि आप बैंडविड्थ को संरक्षित करना चाहते हैं और सर्वर पर अच्छा होना चाहते हैं तो आप मतदान कर रहे हैं।
और If-Modified-Since
हेडर भी है जो आपको लगता है कि आप क्या देख रहे हैं।
तो हम उन्हें गठबंधन है, तो आप कुछ इस तरह के साथ आने सकता है:
import sys
import os.path
import urllib2
url = 'http://www.iana.org/domains/example/'
saved_time_file = 'last time check.txt'
request = urllib2.Request(url)
if os.path.exists(saved_time_file):
""" If we've previously stored a time, get it and add it to the request"""
last_time = open(saved_time_file, 'r').read()
request.add_header("If-Modified-Since", last_time)
try:
response = urllib2.urlopen(request) # Make the request
except urllib2.HTTPError, err:
if err.code == 304:
print "Nothing new."
sys.exit(0)
raise # some other http error (like 404 not found etc); re-raise it.
last_modified = response.info().get('Last-Modified', False)
if last_modified:
open(saved_time_file, 'w').write(last_modified)
else:
print("Server did not provide a last-modified property. Continuing...")
"""
Alternately, you could save the current time in HTTP-date format here:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
This might work for some servers that don't provide Last-Modified, but do
respect If-Modified-Since.
"""
"""
You should get here if the server won't confirm the content is old.
Hopefully, that means it's new.
HTML should be in response.read().
"""
इसके अलावा check out this blog post Stii द्वारा जो कुछ प्रेरणा प्रदान कर सकता है। मुझे अपने उदाहरण में रखने के लिए ETags
के बारे में पर्याप्त जानकारी नहीं है, लेकिन उसका कोड उनके लिए भी जांच करता है।
रिमोट और स्थानीय सामग्री की सामग्री/mimetype क्या हैं? – DeaconDesperado
पूरे पृष्ठों को सहेजना और तुलना करना बहुत अक्षम है। आप सिर्फ md5 की तरह हैश की गणना कर सकते हैं और उसे सहेज सकते हैं। यदि भविष्य में हैश मैच है, तो पृष्ठ नहीं बदला है। – TJD
मैंने आपके संपादन को संबोधित करने के लिए अपना उत्तर अपडेट कर दिया है। क्या आप इसी की तलाश में हैं? – Phil