[英]Does APScheduler Need a Function to Run?
我是编码的新手,这是我的第一个项目。 到目前为止,我已经通过Googling,Tutorials和Stack拼凑了自己的东西。
我正在尝试将来自抓取的RSS提要的熊猫df数据添加到远程sql数据库,然后将脚本托管在heroku或AWS上,并使脚本每小时运行一次。
不过,我很努力,因为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()
时间列似乎有些奇怪,我希望这里有一个TIMESTAMP
或DATETIME
,而不是一个会丢弃很多信息的字符串,只是留下了缩写的星期几和时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.