红联Linux门户
Linux协助

用Python构建你自己的RSS提示体系

发布时刻:2018-03-22 15:17:28来历:linux.cn作者:qhwdw
Python 是十分棒的快速构建运用程序的编程言语。在这篇文章中咱们将学习怎么运用 Python 去构建一个 RSS 提示体系,方针是运用 Fedora 快乐地学习 Python。假如你正在寻觅一个完好的 RSS 提示运用程序,在 Fedora 中现已预备好了几个包。
 
Fedora 和 Python —— 入门常识
Python 3.6 在 Fedora 中是默许装置的,它包括了 Python 的许多规范库。规范库供给了一些能够让咱们的使命愈加简略完结的模块的调集。例如,在咱们的事例中,咱们将运用 sqlite3 模块在数据库中去创立表、增加和读取数据。在这个事例中,咱们企图去处理的是这样的一个特定问题,在规范库中没有包括,而有或许现已有人为咱们开发了这样一个模块。最好是运用像咱们熟知的 PyPI Python 包索引去查找一下。在咱们的示例中,咱们将运用 feedparser 去解析 RSS 源(https://pypi.python.org/pypi/feedparser/5.2.1)。
因为 feedparser 并不是规范库,咱们需求将它装置到咱们的体系上。走运的是,在 Fedora 中有这个 RPM 包,因而,咱们能够运转如下的指令去装置 feedparser:
$ sudo dnf install python3-feedparser
咱们现在现已具有了编写咱们的运用程序所需的东西了。
 
存储源数据
咱们需求存储现已发布的文章的数据,这样咱们的体系就能够只提示新发布的文章。咱们要保存的数据将是用来区分一篇文章的仅有办法。因而,咱们将存储文章的标题和发布日期。
因而,咱们来运用 Python sqlite3 模块和一个简略的 SQL 句子来创立咱们的数据库。一起也增加一些后边即将用到的模块(feedparse,smtplib,和 email)。
 
创立数据库
#!/usr/bin/python3
import sqlite3
import smtplib
from email.mime.text import MIMEText
import feedparser
db_connection = sqlite3.connect('/var/tmp/magazine_rss.sqlite')
db = db_connection.cursor()
db.execute(' CREATE TABLE IF NOT EXISTS magazine (title TEXT, date TEXT)')
这几行代码创立一个名为 magazine_rss.sqlite 文件的新 sqlite 数据库,然后在数据库创立一个名为 magazine 的新表。这个表有两个列 —— title 和 date —— 它们能存诸 TEXT 类型的数据,也就是说每个列的值都是文本字符。
 
查看数据库中的旧文章
因为咱们仅期望增加新的文章到咱们的数据库中,因而咱们需求一个功用去查看 RSS 源中的文章在数据库中是否存在。咱们将依据它来判别是否发送(有新文章的)邮件提示。Ok,现在咱们来写这个功用的代码。
 
def article_is_not_db(article_title, article_date):
""" Check if a given pair of article title and date
is in the database.
Args:
article_title (str): The title of an article
article_date  (str): The publication date of an article
Return:
True if the article is not in the database
False if the article is already present in the database
"""
db.execute("SELECT * from magazine WHERE title=? AND date=?", (article_title, article_date))
if not db.fetchall():
return True
else:
return False
这个功用的首要部分是一个 SQL 查询,咱们运转它去查找数据库。咱们运用一个 SELECT 指令去界说咱们即将在哪个列上运转这个查询。咱们运用 * 符号去选取一切列(title 和 date)。然后,咱们运用查询的 WHERE 条件 article_title 和 article_date 去匹配标题和日期列中的值,以检索出咱们需求的内容。
最终,咱们运用一个简略的回来 True 或许 False 的逻辑来表明是否在数据库中找到匹配的文章。
 
在数据库中增加新文章
现在咱们能够写一些代码去增加新文章到数据库中。
def add_article_to_db(article_title, article_date):
""" Add a new article title and date to the database
Args:
article_title (str): The title of an article
article_date (str): The publication date of an article
"""
db.execute("INSERT INTO magazine VALUES (?,?)", (article_title, article_date))
db_connection.commit()
这个功用很简略,咱们运用了一个 SQL 查询去刺进一个新行到 magazine 表的 article_title 和 article_date 列中。然后提交它到数据库中永久保存。
这些就是在数据库中所需求的东西,接下来咱们看一下,怎么运用 Python 完结提示体系和发送电子邮件。
 
发送电子邮件提示
咱们运用 Python 规范库模块 smtplib 来创立一个发送电子邮件的功用。咱们也能够运用规范库中的 email 模块去格式化咱们的电子邮件信息。
 
def send_notification(article_title, article_url):
""" Add a new article title and date to the database
Args:
article_title (str): The title of an article
article_url (str): The url to access the article
"""
smtp_server = smtplib.SMTP('smtp.gmail.com', 587)
smtp_server.ehlo()
smtp_server.starttls()
smtp_server.login('your_email@gmail.com', '123your_password')
msg = MIMEText(f'\nHi there is a new Fedora Magazine article : {article_title}. \nYou can read it here {article_url}')
msg['Subject'] = 'New Fedora Magazine Article Available'
msg['From'] = 'your_email@gmail.com'
msg['To'] = 'destination_email@gmail.com'
smtp_server.send_message(msg)
smtp_server.quit()
在这个示例中,我运用了谷歌邮件体系的 smtp 服务器去发送电子邮件,在你自己的代码中你需求将它更改为你自己的电子邮件服务供给者的 SMTP 服务器。这个功用是个样板,大多数的内容要依据你的 smtp 服务器的参数来装备。代码中的电子邮件地址和凭据也要更改为你自己的。
假如在你的 Gmail 帐户中运用了双因子认证,那么你需求装备一个暗码运用程序为你的这个运用程序供给一个仅有暗码。能够看这个协助页面(https://support.google.com/accounts/answer/185833?hl=en)。
 
读取 Fedora Magazine 的 RSS 源
咱们现已有了在数据库中存储文章和发送提示电子邮件的功用,现在来创立一个解析 Fedora Magazine RSS 源并提取文章数据的功用。
def read_article_feed():
""" Get articles from RSS feed """
feed = feedparser.parse('https://fedoramagazine.org/feed/')
for article in feed['entries']:
if article_is_not_db(article['title'], article['published']):
send_notification(article['title'], article['link'])
add_article_to_db(article['title'], article['published'])
if __name__ == '__main__':
read_article_feed()
db_connection.close()
在这里咱们将运用 feedparser.parse 功用。这个功用回来一个用字典表明的 RSS 源,关于 feedparser 的完好描绘能够参阅它的文档(https://pythonhosted.org/feedparser/reference.html)。
RSS 源解析将回来最终的 10 篇文章作为 entries,然后咱们提取以下信息:标题、链接、文章发布日期。因而,咱们现在能够运用前面界说的查看文章是否在数据库中存在的功用,然后,发送提示电子邮件并将这个文章增加到数据库中。
当运转咱们的脚本时,最终的 if 句子运转咱们的 read_article_feed 功用,然后封闭数据库衔接。
 
运转咱们的脚本
给脚本文件赋于正确运转权限。接下来,咱们运用 cron 实用程序去每小时主动运转一次咱们的脚本。cron 是一个作业方案程序,咱们能够运用它在一个固定的时刻去运转一个使命。
$ chmod a+x my_rss_notifier.py
$ sudo cp my_rss_notifier.py /etc/cron.hourly
为了使该教程坚持简略,咱们运用了 cron.hourly 目录每小时运转一次咱们的脚本,假如你想学习关于 cron 的更多常识以及怎么装备 crontab,请阅览 cron 的 wikipedia 页面(https://en.wikipedia.org/wiki/Cron)。
 
总结
在本教程中,咱们学习了怎么运用 Python 去创立一个简略的 sqlite 数据库、解析一个 RSS 源、以及发送电子邮件。我期望经过这篇文章能够向你展现,运用 Python 和 Fedora 构建你自己的运用程序是件多么简略的事。
这个脚本在 GitHub 上能够找到(https://github.com/cverna/rss_feed_notifier)。
 
RSS新闻阅览器Liferea 1.12.0发布,Ubuntu下装置办法:http://www.138comgov138.com/linux/32980.html
5个开源RSS订阅阅览器:http://www.138comgov138.com/linux/29906.html
Alduin—支撑Linux的跨渠道开源RSS阅览器:http://www.138comgov138.com/linux/26471.html
Ubuntu装置FeedReader-RSS阅览器:http://www.138comgov138.com/linux/24385.html
Newsbeuter:Linux上的指令行RSS阅览器:http://www.138comgov138.com/linux/23850.html