永康网站开发,好的app设计网站,冠县住房和城乡建设局网站,成都设计网站RT#xff0c;最近在学scrapy#xff0c;写了一个简单的爬取网页数据的爬虫#xff0c;利用CrawlProcess单次调用执行的时候没有问题#xff0c;脚本如下#xff0c;就是清空数据表然后爬取数据#xff1a;
class updateBoardData:
def __init__(self):
self.db connect…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(settingsget_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 nnnn
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(settingsget_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比较熟悉的能够给一点意见吗