我是编码的新手,这是我的第一个项目。到目前为止,我通过谷歌搜索,教程和堆栈将我所拥有的东西拼凑在一起。
我正在尝试将已删除的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'
答案 0 :(得分:0)
是。你想要执行的必须是一个函数(或另一个可调用的,如方法)。装饰器语法(@sched.…
)需要应用装饰器的函数定义(def …
)。示例中的代码无法编译。
然后它是一个阻塞调度程序,这意味着如果你调用sched.start()
这个方法不会返回(除非你在某些调度代码中停止调度程序),并且在调用执行后没有任何内容。
进口应该到顶部,然后更容易看到模块所依赖的内容。并且不要导入你实际上没有使用的东西。
我不确定为什么要为不真正需要pandas
个对象的数据导入和使用DataFrame
。此外,SQLAlchemy没有实际使用任何东西,这个库将和格式化值作为字符串提供给is dangerous!
只需将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
而不是一个丢弃大部分信息的字符串,只留下缩短的工作日和时间。