Pythonを使用して新しいプレスを直接受信トレイに配信する

この記事では、次のPython機能について説明します。

これにはすべて、実例が付随します。

背景


多くの人々は、アメリカの郊外大使の典型的な朝の標準的な映画のシーンを覚えています。男が自転車に乗って自転車に乗り、新聞をばらまきます。 そして、大きくて毛むくじゃらのいい犬が家族の頭に新聞を持ってきます。 しかし、進歩は進行中であり、新聞はデジタル形式で入手できるようになり、郵便で配達を注文することもできます。 一部のサイトでは、この機会はお金のために提供されていますが、私のお気に入りではありますが、IT Sport Expressの世界とはかけ離れています。この機会はまったくありません。 しかし、pdfをダウンロードする機会があります。
これに関連して、私は毎朝サイトにアクセスし、そこでリンクをたどり、それをコンピューターにダウンロードし、キンドルボックスに送信し、Kindleでwi-fiをオンにしなければなりませんでした。電車で。

最も単純なWebページ分析


Webを操作するには、urllib2モジュールが使用されます。 このモジュールを使用すると、ページのコンテンツなどを取得できます。 ただし、この場合、その機能の1つで十分です。ページを表示します。

def download_by_link(self, link): content = urllib2.urlopen(link).read() #  html,    link link_on_file, filename = self.get_filename(content) #   html    fullname = self.get_dir_name() + filename if self.is_new_version(fullname): with open(fullname, 'w') as fd: content = urllib2.urlopen(link_on_file).read() #   fd.write(content) return self.get_prepared_files(fullname) 


withは、C#での使用とJava 7での試行に類似しています。要するに、withは、このブロックでキャプチャされたリソースが、それを超えるとすぐに解放されることを保証します(通常の終了または例外の場合)。

新聞の最新号のアーカイブへのリンクを取得するために、正規表現のフルパワーを実装するreモジュールを使用します。 確かに、urllib2の場合のように、超自然的なものは必要ありません。
  def get_filename(self, text): pattern = r'(?P<link>http:\/\/archive\.sport\-express\.ru\/pdf\/(?P<filename>[0-9]+\.zip))' match = re.search(pattern, text) return match.group('link'), match.group('filename') 


(?P)-これは、レギュラーシーズンの名前付きグループの設定方法です。 したがって、リンクとファイル名を取得します。

 class SportExpress(): def get_from(self): return 'username@mail.ru' def get_title(self): return 'Sport Express subscribe' def get_text(self): return "Good morning! Don't be lazy - read newspaper!" def get_prepared_files(self, archive): directory_to_extract = archive[:archive.rfind('.')] zipfile.ZipFile(archive).extractall(directory_to_extract) #      res = glob.glob(directory_to_extract+'/*.*') return res def get_dir_name(self): dir_name = 'archive/sport-express/' if not os.path.exists(dir_name): os.mkdir(dir_name) return dir_name def is_new_version(self, filename): return os.path.exists(self.get_dir_name() + filename) 


手紙を作成する


送信する予定のコンテンツができたので、そのための「エンベロープ」を作成するとよいでしょう。
Pythonで文字を操作するには、モジュールが使用されます...モジュールが使用されます...メールモジュールが使用されます。
 import email, email. encoders, email.mime.text, email.mime.base class MessageBase: def __init__(self, subscriber): self.__to_addresses = subscriber.get_subscribers() self.__from_address = subscriber.get_from() self.__message = self.__create_message(subscriber.get_title(), subscriber.get_text()) 

まず、簡単なテキストレターを作成します。 もちろん、MIMEの詳細はこちらから入手できます
  def __create_message(self, subject, text): email_msg = email.MIMEMultipart.MIMEMultipart('mixed') email_msg['Subject'] = subject email_msg['From'] = self.get_from() email_msg['To'] = ', '.join(self.get_to()) email_msg.attach(email.mime.text.MIMEText(text,'text')) return email_msg 

ファイルを添付する関数を作成します。 メールクライアントで添付ファイルを開くことができるようにするには、file_typeを指定する必要があります。
  def attach_file(self, filename, file_link, file_type = 'unknown'): file_message = email.mime.base.MIMEBase('application', file_type) file_message.set_payload(file(file_link).read()) email.encoders.encode_base64(file_message) file_message.add_header('Content-Disposition','attachment;filename='+filename) self.__message.attach(file_message) return True 


送信するメッセージからメッセージを受信するには、as_string()メソッドを呼び出す必要があります。
  def get_text(self): return self.__message.as_string() 


手紙を送る


手紙を受け取ったので、それを送信できるようにする必要があります。 Smtplibは、Pythonにメールを送信する責任があります。
 import smtplib from message import MessageBase class SmtpBase: def __init__(self, serverhost): self.__smtp_server = serverhost def open(self): self.__server = smtplib.SMTP(self.__smtp_server) self.__server.login('<enter your smtp login>', '<enter your smtp password>') def close(self): self.__server.quit() 


メソッドget_from()、get_to()、get_text()を持つMessageクラスがあると想像してください。
  def send_mail(self, message): for message_to in message.get_to(): self.__server.sendmail(message.get_from(), message_to, message.get_text()) 


「with」をサポートするには、いくつかのメソッドを追加する必要があります。
  def __enter__(self): self.open() return self def __exit__(self, type, value, traceback): if type: print '%s: %s %s' % (type, value, traceback) self.close() 


要約する


これで必要なものはすべて揃いました。
私の最終的なスクリプトは次のようになります。
 from subscriber_sex import SportExpress from smtp import SmtpBase from message import MessageBase b = SportExpress() filenames = b.download_by_link('http://www.sport-express.ru') msg = MessageBase(b) for file in filenames: msg.attach_file(file[file.rfind('/')+1:], file, 'pdf') with SmtpBase('smtp.yandex.ru') as s: s.send_mail(msg) 

このスクリプトを起動するたびに、Sport Expressの最新号が受信トレイにドロップされます! 他の出版物が無料のpdf版の雑誌を配布しているコメントで共有することを提案します。 原則として、pdfにしないことは可能です。主なことは、定期的に新しい問題を受け取ることができるということです。

したがって、新しい雑誌をダウンロードするには、3つの機能を変更するだけです。

この資料が読者にとって有用で楽しいものであったことを願っています。

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


All Articles