python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...
RT,最近在學scrapy,寫了一個簡單的爬取網頁數據的爬蟲,利用CrawlProcess單次調用執行的時候沒有問題,腳本如下,就是清空數據表然后爬取數據:
class updateBoardData:
def __init__(self):
self.db = connectMYSQL()
def update(self):
sql = "truncate table board_data;"
con = self.db.connect()
cursor = con.cursor()
cursor.execute(sql)
con.commit
cursor.close()
con.close()
print 'truncated'
process = CrawlerProcess(settings=get_project_settings())
process.crawl(board_spider)
process.start()
雖然單次執行沒問題,但是在每日定時執行的腳本里調用這個類卻出錯了,每日執行的腳本如下,大意就是第一次執行爬蟲后,每天凌晨0點定時執行爬蟲:
SECONDS_PER_DAY = 24 * 60 * 60
upd = updateBoardData()
while True:
upd.update()
print datetime.now()
print 'n'+'n'+'n'+'n'
cur_time = datetime.now()
descTime = cur_time.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
delaytime = cur_time - descTime
skipSeconds = SECONDS_PER_DAY - delaytime.total_seconds()
time.sleep(skipSeconds)
第一次調用該腳本會執行一次爬蟲程序,但是等到0點的時候再次調用爬蟲卻報錯了,報錯信息為:
twisted.internet.error.ReactorNotRestartable
去查了一下twisted框架,發現在twisted中,reactor是單例模式,可能我在重復使用CrawlProcess的時候創建多個reactor實例,于是修改了一下爬蟲的調用腳本測試了一下,只用單個實例來爬蟲,修改后的代碼如下:
class updateBoardData:
def __init__(self):
self.db = connectMYSQL()
self.process = CrawlerProcess(settings=get_project_settings())
self.process.crawl(board_spider)
def update(self):
con = self.db.connect()
cursor = con.cursor()
cursor.execute(sql)
con.commit
cursor.close()
con.close()
print 'truncated'
self.process.start()
a = updateBoardData()
a.update()
print 'pls wait 5s'
time.sleep(5)
a.update()
直接跑這個腳本,發現第一次執行函數沒有問題,但是第二次執行函數的時候知識清空了數據表而爬蟲程序卻沒有執行。執行的結果如下:
2017-01-19 15:40:47 [scrapy] INFO: Spider closed (finished)
pls wait 5s
truncated
到此,我的思路就卡住了,想不出問題處在哪里,定時執行scrapy爬蟲應該是一個很常見的功能,可能是我的思路的方向錯了,到底要怎樣才能每天定時執行一個爬蟲呢?
有沒有人對Scrapy比較熟悉的,能夠給一點意見嗎?
總結
以上是生活随笔為你收集整理的python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: express模板引擎 html,Exp
- 下一篇: C++多重继承师生类复盘