Python APScheduler是否需要一个函数才能运行?
我对编码是新手,这是我的第一个项目。到目前为止,我已经通过谷歌搜索、教程和堆栈拼凑了我所拥有的 我正在尝试将从一组已删除的RSS提要中添加的数据添加到远程sql数据库中,然后将脚本托管在heroku或AWS上,并让脚本每小时运行一次 我使用ApsScheduler的人 不过我很挣扎,因为ApsScheduler周围没有任何“傻瓜”教程。这就是我到目前为止所创造的 我想我的问题是,我的脚本是否需要在APScheduler触发它的函数中,或者它是否可以以另一种方式工作Python APScheduler是否需要一个函数才能运行?,python,apscheduler,Python,Apscheduler,我对编码是新手,这是我的第一个项目。到目前为止,我已经通过谷歌搜索、教程和堆栈拼凑了我所拥有的 我正在尝试将从一组已删除的RSS提要中添加的数据添加到远程sql数据库中,然后将脚本托管在heroku或AWS上,并让脚本每小时运行一次 我使用ApsScheduler的人 不过我很挣扎,因为ApsScheduler周围没有任何“傻瓜”教程。这就是我到目前为止所创造的 我想我的问题是,我的脚本是否需要在APScheduler触发它的函数中,或者它是否可以以另一种方式工作 from apschedule
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'
来自apscheduler.schedulers.blocking import BlockingScheduler
sched=阻塞调度程序()
@计划作业('间隔',分钟=1)
sched.configure()
附表开始()
作为pd进口熊猫
从pandas.io导入sql
导入feedparser
导入时间
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”)
摘要='text'
职位=[]
对于rawrss中的url:
feed=feedparser.parse(url)
对于在feed.entries中发布的内容:
posts.append((时间、post.title、post.link、摘要))
df=pd.DataFrame(posts,columns=['article\u time','article\u title','article\u url','article\u summary'])将数据传递给init
df.set_索引(['article_time'],inplace=True)
导入pymysql
从sqlalchemy导入创建引擎
engine=create_engine('mysql+pymysql://::3306/?charset=utf8',编码='utf-8')
engine.execute(“插入rsstracker值('%s','%s','%s','%s')”)”%(时间,post.title,post.link,摘要))
to_sql(con=engine,name='rsstracker',如果_exists='append')#,flavor='mysql'
是。您想要执行的必须是一个函数(或另一个可调用的函数,如方法)。decorator语法(@sched….
)需要应用decorator的函数定义(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()
#/usr/bin/env python
#编码:utf-8
来自未来导入绝对导入、分割、打印功能
从时间导入strftime
导入feedparser
从apscheduler.schedulers.blocking导入阻止调度程序
从sqlalchemy导入创建引擎,元数据
sched=阻塞调度程序()
RSS_URL=[
'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',
]
@计划作业('间隔',分钟=1)
def进程_提要():
时间=strftime(“%a%H:%M:%S”)
摘要='text'
引擎=创建引擎(
'mysql+pymysql://::3306/?charset=utf8'
)
元数据=元数据(引擎,反射=True)
rsstracker=metadata.tables['rsstracker']
对于RSS_url中的url:
feed=feedparser.parse(url)
对于在feed.entries中发布的内容:
(
rsstracker.insert()
.价值观(
时间=时间,
title=post.title,
url=post.link,
摘要=摘要,
)
.execute()
)
def main():
sched.configure()
附表开始()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
时间列似乎有点奇怪,我希望这里有
时间戳
或日期时间
,而不是一个丢弃很多信息的字符串,只留下缩写的星期和时间。谢谢!我需要通读你的剧本才能理解你是如何做到这一点的。和我的相比,它太整洁了。至于熊猫,我从阅读开始,我知道这是不对的,但它正在发挥作用,我不想在实现我的第一个目标之前打破它,将它发送到数据库。我将研究如何将时间更改为时间戳,这正是我试图实现的目标。我可以在没有pymysql的情况下使用SQLAlchemy吗?您需要一个模块来与MySQL数据库通信,它不必是pymysql
。SQLAlchemy文档及其特性/限制。我一直收到一个关键错误。我删除并重新创建了该表,但它仍在进行回溯(最近一次调用):文件“/usr/local/lib/python3.5/dist packages/apscheduler/executors/base.py”,第125行,在run_job retval=job.func(*job.args,**job.kwargs)文件“”中,第20行,在进程中KeyError:'rsstracker'那么没有名为rsstracker的表,或者您需要在那里提供一个更限定的名称。打印(metadate.tables.keys())
告诉您什么?