Pythonを使用したHabrahabrに関する新しいトピックの通知

プログラム/コードが完全に異なる場合、私はそれが好きです...あなたは各文字の目的と解決策がまさにそれである理由を理解しています。 このトピックでは、サードパーティのライブラリなしでPythonのHabrahabrトピックのパーサーを提供したいと思います。
新しいトピックが表示されると、ポップアップウィンドウでこれが通知されます。


GNOMEを搭載したLinuxの現在のバージョンですが、システム用に1行が再作成されています。
次のような言葉で機能します。

1)サイトのルートファイルを目的の名前で独自にダウンロードします。
2)ファイルを開く
3)ブログの名前で適切な瞬間まで読み取り、名前自体をフィルタリングする行ごと
4)トピックの名前がある時点まで読み続け、名前自体をフィルタリングします
5)トピックの日付と同じ
6)各トピックの名前を先ほど見たものと比較する
7)トピックが一致しなかった場合-新しいトピックのブログ/トピック/日付でポップアップウィンドウを作成します
8)一致する場合-プログラムを終了する

これをPythonで実装します(コードの一部は連続して、クリッピングなしで移動します):

インタープリター、エンコード、必要なモジュール、および一時ファイルを保存するユーザーのホームフォルダーを指定します(後者はシステムに合わせて編集する必要があります)。
#!/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ファイルが存在する場合、スクリプトは既に起動されています。そうでない場合は、空の行でファイルを作成します。 topic1変数に、最後に表示されたトピックの名前と、スクリプトが初めて実行される場合は空の行割り当てます。
 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 Rootファイルをダウンロードします(メインページに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") 


これらの行が基本です -後でそのような部分が見つかるまでファイルを1行ずつ読み取ります。
  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行以内であることがわかります)。それをフィルタリングして、 トピック変数に割り当てます。 トピックが最後に表示されたトピック( topic!= 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行以内で必要になるまで、1行ずつもう一度読み取ります。
  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(notify)行は、新しいトピックに関する情報を含む同じポップアップウィンドウを作成します。 コンテンツは上の行に記入されます。 不要なソースHTMLファイルを削除し、プログラムを終了します。

前に見た最後のトピックを見つけたらすぐに、HTMLファイルを削除してシステムを終了します。
  else: os.system("rm -f " + HTML_DIR) sys.exit() 


これはメインループの最初の反復でした。 最初のページよりも多くのトピックを見逃した場合は、次のページを開いてすべてを繰り返します。
  n += 1 index.close() 


Gnome環境では、 notify-sendコマンドがポップアップを処理します。 ご使用のシステムでは、異なる場合があります。 次に、変数notify = "notify-send 'Habrahabr.ru:" + blog + "' '" + topic + "\ n " + date + " '"の構文を含む行を編集します。

ここでは、意図的に行を左に揃えなかったので、何が後になって何に依存するかがより明確になりました。 左から2タブずつ下から3番目のコードを修正する必要がありました。修正しないと、あまり美しく見えません。 したがって、混乱しないように、ここにスクリプト全体を示します。
 #!/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(notify)の行を前の行とコメントアウトします。 それ以外の場合は、 python path_to_script / HabraParser.pyコマンドcrontabに配置して、たとえば30分ごとに呼び出すことができます。 または、手動で行うことができます-決定はあなた次第です! 主なことは、ファイルが保存されるディレクトリを調整することです。

新しいトピックが検出されると、画面の下部にどのように表示されるかを以下に示します。
画像

それだけです...私のは便利です!

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


All Articles