पायथन का उपयोग करते हुए हैब्रहाब पर एक नए विषय की अधिसूचना

मुझे यह पसंद है जब प्रोग्राम / कोड पूरी तरह से अलग है ... आप प्रत्येक पत्र के उद्देश्य को समझते हैं और इसका समाधान क्यों है। इस विषय में मैं थर्ड-पार्टी पुस्तकालयों के बिना पायथॉन में हबराब्र विषय के अपने पार्सर की पेशकश करना चाहता हूं।
जब एक नया विषय प्रकट होता है - एक पॉप-अप विंडो इस बारे में सूचित करती है।


गनोम के साथ लिनक्स के लिए वर्तमान संस्करण, लेकिन आपके सिस्टम के लिए 1 पंक्ति को फिर से बनाया गया है।
यह इस तरह से काम करता है:

1) वांछित नाम के तहत अपनी खुद की साइट की रूट फ़ाइल डाउनलोड करें
2) फ़ाइल खोलें
3) लाइन से लाइन हम ब्लॉग के नाम के साथ सही क्षण तक पढ़ते हैं और नाम को ही फ़िल्टर करते हैं
4) हम विषय के नाम के साथ क्षण तक पढ़ना जारी रखते हैं और नाम को फ़िल्टर करते हैं
5) विषय की तारीख के साथ भी ऐसा ही है
6) पहले देखे गए अंतिम के साथ प्रत्येक विषय के नाम की तुलना करें
7) यदि विषय मेल नहीं खाता है - नए विषय के ब्लॉग / विषय / तिथि के साथ एक पॉप-अप विंडो बनाएं
8) यदि वे मेल खाते हैं - कार्यक्रम से बाहर निकलें

हम इसे पायथन में लागू करते हैं (कोड के कुछ भाग क्रमिक रूप से और बिना कतरनों के):

हम दुभाषिया, एन्कोडिंग, आवश्यक मॉड्यूल और उपयोगकर्ता के होम फ़ोल्डर को निर्दिष्ट करते हैं जहां अस्थायी फ़ाइलों को संग्रहीत किया जाएगा (उत्तरार्द्ध को आपके सिस्टम के लिए संपादित किया जाना चाहिए):
#!/usr/bin/python # -*- coding: utf-8 -*- import os, sys HOME_DIR = "/home/user" 


कार्य करने के लिए स्क्रिप्ट के लिए आवश्यक चर निर्दिष्ट करें:
 LAST_DIR = HOME_DIR + "/.habralast" #       HTML_DIR = HOME_DIR + "/.habr.html" #     SHOW_FIRST_TIME = 5 #          n = 1 new_addr = 0 count = 0 


जांचें कि क्या स्क्रिप्ट पहली बार चल रही है: यदि .habralast फ़ाइल मौजूद है, तो स्क्रिप्ट पहले ही चल चुकी है, अन्यथा, हम फ़ाइल को एक खाली लाइन के साथ बनाते हैं। हम विषय 1 चर को अंतिम विषय के नाम और एक खाली लाइन के रूप में निर्दिष्ट करते हैं यदि स्क्रिप्ट पहली बार चलाई जाती है:
 if os.path.isfile(LAST_DIR): fp = open(LAST_DIR, "r") topic1 = fp.readline() fp.close() last_existed = 1 else: fp = open(LAST_DIR, "w") topic1 = "" fp.close() last_existed = 0 


Habrahabr रूट फ़ाइल डाउनलोड करें (मुख्य पृष्ठ पर 10 विषय प्रदर्शित किए जाते हैं - यदि आप अधिक छूट गए हैं: पृष्ठ habrahabr.ru/page N खोलें, जहां N पृष्ठ संख्या है):
 while(1): if n == 1: url = "habrahabr.ru" else: url = "habrahabr.ru/page" + str(n) + "/" wget = "wget " + url + " -O " + HTML_DIR try: os.system(wget) except: print "Cannot connect to server" sys.exit() 


परिणामी पृष्ठ पाठ खोलें:
  index = open(HTML_DIR, "r") 


ये रेखाएँ आधार हैं - बाद में हम फ़ाइल लाइन को तब तक पढ़ेंगे जब तक हमें ऐसे भाग नहीं मिलेंगे:
  s = ' <a href="http://habrahabr.ru/' #     ss = ' <a' #     sss = ' <div class="published"><!--    ISO   title -->' #      

मुझे कई बार यकीन हो गया था कि ये पंक्तियाँ कहीं और नहीं मिलेंगी! इसलिए, हम इसे सुरक्षित रूप से उपयोग कर सकते हैं, कोई भ्रम नहीं होगा।

हम ब्लॉग नाम के संकेत की उपस्थिति के लिए प्रत्येक पंक्ति को बारी-बारी से जाँचते हैं (2000 को विषय के लिए आवंटित HTML फ़ाइल में लाइनों की संख्या से प्रयोगात्मक रूप से लिया गया है) और इसे फ़िल्टर करके, इसे ब्लॉग चर पर असाइन करें:
  for i in range(2000): line = index.readline() if s in line: blog_s = line.find('">') blog_e = line.find("</a>") blog = line[blog_s+2:blog_e] 


हमें एक ब्लॉग मिला - हम एक विषय नाम टैग की तलाश कर रहे हैं (पृष्ठ कोड से आप देख सकते हैं कि विषय ब्लॉग से 50 पंक्तियों से आगे नहीं है) और इसे फ़िल्टर करते हुए, इसे विषय चर पर असाइन करें। यदि विषय अंतिम बार देखे गए एक से मेल नहीं खाता है ( विषय! = Topic1 ) - हम .habralast फ़ाइल में एक नया लिखते हैं, तो हम ऐसा कोई चेक नहीं करते हैं ताकि बाद में विषय न लिखें, क्योंकि पहला नया:
  for j in range(50): line = index.readline() if ss in line: topic_s = line.find('">') topic_e = line.find("</a>") topic = line[topic_s+2:topic_e] if topic.find("</span>") != -1: topic = topic[topic.find("</span>")+7:] if topic != topic1: if new_addr == 0: fp = open(LAST_DIR, "w") fp.write(topic) fp.close() new_addr = 1 print "Blog:\t" + blog print "Topic:\t" + topic 

... मैंने देखा कि कभी-कभी विषय नाम की शुरुआत में टैग डाले जाते हैं, लेकिन हमें उनकी आवश्यकता नहीं है, इसलिए हम इसे फ़िल्टर करते हैं। हम ब्लॉग और विषय के नामों के साथ प्रिंट करते हैं (यदि वांछित है, तो प्रिंट के साथ सभी लाइनों पर टिप्पणी की जा सकती है)।

तब हम इसे लाइन द्वारा फिर से पढ़ते हैं जब तक विषय की तारीख दिखाई नहीं देती है, 100 से अधिक लाइनों की आवश्यकता नहीं होती है:
  for k in range(100): line = index.readline() if sss in line: line = index.readline() time_s = line.find("<span>") time_e = line.find("</span>") date = line[time_s+6:time_e] print "Date:\t" + date + "\n" notify = "notify-send 'Habrahabr.ru: " + blog + "' '" + topic + "\n<i>" + date + "</i>'" os.system(notify) count += 1 if count == SHOW_FIRST_TIME and last_existed == 0: os.system("rm -f " + HTML_DIR) sys.exit() break break 

Os.system (अधिसूचित) लाइन नए विषय के बारे में जानकारी के साथ एक ही पॉप-अप विंडो बनाती है। सामग्री ऊपर की लाइन में भरी गई है। हम स्रोत HTML फ़ाइल को अनावश्यक के रूप में हटाते हैं और प्रोग्राम से बाहर निकलते हैं।

जैसे ही आप पिछले विषय को देखते हैं, जिसे आपने पहले देखा था, HTML फ़ाइल को हटा दें और सिस्टम से बाहर निकलें:
  else: os.system("rm -f " + HTML_DIR) sys.exit() 


यह मुख्य लूप का पहला पुनरावृत्ति था। यदि आप पहले पृष्ठ पर हैं, तो इससे अधिक विषय छूट गए, अगले एक को खोलें और सब कुछ दोहराएं:
  n += 1 index.close() 


सूक्ति वातावरण में, पॉप-अप के लिए सूचित-भेजें आदेश जिम्मेदार है। आपके सिस्टम पर, यह अलग हो सकता है। फिर अपने सिंटैक्स के साथ अपने कमांड के तहत लाइन को वेरिएबल नोटिफ़िकेशन = "नोटिफ़ाय-सेंड 'हबराब्रुक:" + ब्लॉग + "' '+ टॉपिक +" \ n "+ डेट +" " के साथ एडिट करें।

यहां, मैंने जानबूझकर बाईं ओर लाइनों को संरेखित नहीं किया, ताकि यह अधिक स्पष्ट हो सके कि इसके बाद क्या आता है और यह किस पर निर्भर करता है। मुझे 3 कोड को नीचे से 2 टैब से बाईं ओर ठीक करना था, अन्यथा यह बहुत सुंदर नहीं लगता। इसलिए, यहाँ पूरी स्क्रिप्ट है, ताकि भ्रमित न हों:
 #!/usr/bin/python # -*- coding: utf-8 -*- import os, sys HOME_DIR = "/home/user" LAST_DIR = HOME_DIR + "/.habralast" HTML_DIR = HOME_DIR + "/.habr.html" SHOW_FIRST_TIME = 5 n = 1 new_addr = 0 count = 0 if os.path.isfile(LAST_DIR): fp = open(LAST_DIR, "r") topic1 = fp.readline() fp.close() last_existed = 1 else: fp = open(LAST_DIR, "w") topic1 = "" fp.close() last_existed = 0 while(1): if n == 1: url = "habrahabr.ru" else: url = "habrahabr.ru/page" + str(n) + "/" wget = "wget " + url + " -O " + HTML_DIR try: os.system(wget) except: print "Cannot connect to server" sys.exit() index = open(HTML_DIR, "r") s = ' <a href="http://habrahabr.ru/' ss = ' <a' sss = ' <div class="published"><!--    ISO   title -->' for i in range(2000): line = index.readline() if s in line: blog_s = line.find('">') blog_e = line.find("</a>") blog = line[blog_s+2:blog_e] for j in range(50): line = index.readline() if ss in line: topic_s = line.find('">') topic_e = line.find("</a>") topic = line[topic_s+2:topic_e] if topic.find("</span>") != -1: topic = topic[topic.find("</span>")+7:] if topic != topic1: if new_addr == 0: fp = open(LAST_DIR, "w") fp.write(topic) fp.close() new_addr = 1 print "Blog:\t" + blog print "Topic:\t" + topic for k in range(100): line = index.readline() if sss in line: line = index.readline() time_s = line.find("<span>") time_e = line.find("</span>") date = line[time_s+6:time_e] print "Date:\t" + date + "\n" notify = "notify-send 'Habrahabr.ru: " + blog + "' '" + topic + "\n<i>" + date + "</i>'" os.system(notify) count += 1 if count == SHOW_FIRST_TIME and last_existed == 0: os.system("rm -f " + HTML_DIR) sys.exit() break break else: os.system("rm -f " + HTML_DIR) sys.exit() n += 1 index.close() 


मैंने इस स्क्रिप्ट को टर्मिनल में चलाया, और स्क्रिप्ट और पॉप-अप विंडो का आउटपुट दिखाई दिया। यदि आप केवल टर्मिनल में स्क्रिप्ट का उपयोग करते हैं और आपको पॉप-अप की आवश्यकता नहीं है - पिछले एक के साथ लाइन os.system (सूचित करें) पर टिप्पणी करें । अन्यथा, आप python path_to_script / HabraParser.py कमांड को crontab में रख सकते हैं और कॉल कर सकते हैं, कह सकते हैं, हर 30 मिनट में। या आप इसे मैन्युअल रूप से कर सकते हैं - निर्णय आपका है! मुख्य बात यह है कि निर्देशिका को समायोजित करना है जहां फाइलें सहेजी जाएंगी।

नए विषय का पता चलने पर यह स्क्रीन के निचले भाग में कैसा दिखता है:
छवि

यह सब ... मेरा सुविधाजनक है!

Source: https://habr.com/ru/post/In127806/


All Articles