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比较熟悉的,能够给一点意见吗?