繁体   English   中英

APScheduler是否需要功能才能运行?

[英]Does APScheduler Need a Function to Run?

我是编码的新手,这是我的第一个项目。 到目前为止,我已经通过Googling,Tutorials和Stack拼凑了自己的东西。

我正在尝试将来自抓取的RSS提要的熊猫df数据添加到远程sql数据库,然后将脚本托管在heroku或AWS上,并使脚本每小时运行一次。

这里的某人建议我像本文中那样使用APScheduler。

不过,我很努力,因为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'

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

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

导入应该放在顶部,然后可以更轻松地查看模块所依赖的内容。 并且不要导入您实际上不使用的东西。

我不确定为什么要导入并使用pandas来存储不需要真正的DataFrame对象的数据。 还有SQLAlchemy却没有实际使用此库提供的任何内容, 并且将值格式化为字符串格式到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 ,而不是一个会丢弃很多信息的字符串,只是留下了缩写的星期几和时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM