APScheduler是否需要运行功能?

时间:2017-09-13 13:53:06

标签: python apscheduler

我是编码的新手,这是我的第一个项目。到目前为止,我通过谷歌搜索,教程和堆栈将我所拥有的东西拼凑在一起。

我正在尝试将已删除的RSS源的pandas df中的数据添加到远程sql数据库,然后在heroku或AWS上托管脚本并让脚本每小时运行一次。

here recommend上有人使用了APScheduler as in this post

我很挣扎,因为APScheduler周围没有任何'傻瓜'教程。这就是我到目前为止所创造的。

我想我的问题是我的脚本需要在APScheduler的函数中触发它还是可以以其他方式工作。

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', minutes=1)

sched.configure()
sched.start()

import pandas as pd
from pandas.io import sql
import feedparser
import time


rawrss = ['http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
          'https://www.yahoo.com/news/rss/',
          'http://www.huffingtonpost.co.uk/feeds/index.xml',
          'http://feeds.feedburner.com/TechCrunch/',
          'https://www.uktech.news/feed'
         ]

time = time.strftime('%a %H:%M:%S')
summary = 'text'

posts = []
for url in rawrss:
    feed = feedparser.parse(url)
    for post in feed.entries:
        posts.append((time, post.title, post.link, summary))

df = pd.DataFrame(posts, columns=['article_time','article_title','article_url', 'article_summary']) # pass data to init
df.set_index(['article_time'], inplace=True)

import pymysql
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://<username>:<host>:3306/<database_name>?charset=utf8', encoding = 'utf-8')
engine.execute("INSERT INTO rsstracker VALUES('%s', '%s', '%s','%s')" % (time, post.title, post.link, summary))

df.to_sql(con=engine, name='rsstracker', if_exists='append') #, flavor='mysql'

1 个答案:

答案 0 :(得分:0)

是。你想要执行的必须是一个函数(或另一个可调用的,如方法)。装饰器语法(@sched.…)需要应用装饰器的函数定义(def …)。示例中的代码无法编译。

然后它是一个阻塞调度程序,这意味着如果你调用sched.start()这个方法不会返回(除非你在某些调度代码中停止调度程序),并且在调用执行后没有任何内容。

进口应该到顶部,然后更容易看到模块所依赖的内容。并且不要导入你实际上没有使用的东西。

我不确定为什么要为不真正需要pandas个对象的数据导入和使用DataFrame。此外,SQLAlchemy没有实际使用任何东西,这个库将格式化值作为字符串提供给is dangerous!

的SQL查询

只需将SQLAlchemy用于数据库,它可能如下所示:

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
from time import strftime

import feedparser
from apscheduler.schedulers.blocking import BlockingScheduler
from sqlalchemy import create_engine, MetaData

sched = BlockingScheduler()


RSS_URLS = [
    'http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
    'https://www.yahoo.com/news/rss/',
    'http://www.huffingtonpost.co.uk/feeds/index.xml',
    'http://feeds.feedburner.com/TechCrunch/',
    'https://www.uktech.news/feed',
]


@sched.scheduled_job('interval', minutes=1)
def process_feeds():
    time = strftime('%a %H:%M:%S')
    summary = 'text'

    engine = create_engine(
        'mysql+pymysql://<username>:<host>:3306/<database_name>?charset=utf8'
    )
    metadata = MetaData(engine, reflect=True)
    rsstracker = metadata.tables['rsstracker']

    for url in RSS_URLS:
        feed = feedparser.parse(url)
        for post in feed.entries:
            (
                rsstracker.insert()
                    .values(
                        time=time,
                        title=post.title,
                        url=post.link,
                        summary=summary,
                    )
                    .execute()
            )


def main():
    sched.configure()
    sched.start()


if __name__ == '__main__':
    main()

时间列似乎有点奇怪,我原本期望在这里TIMESTAMPDATETIME而不是一个丢弃大部分信息的字符串,只留下缩短的工作日和时间。