提出问题
我想使用django-apscheduler实现定时爬取数据并存储到数据库中,代码如下:
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用默认的DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 每隔半个小时执行这个任务
@register_job(scheduler, 'interval', id='saveOfficialPriceToSql', minutes=5)
def saveOfficialPriceToSql(request):
print("现在时间是:",timezone.now())
#userName = request.session.get('user_name', None)
# 一共有ShoesId,size,date,price四个字段要存储
# 读取相应用户所需要爬取的商品id
userName="fgx"
shoes=Shoes.objects.all()
print(type(shoes))
for shoe in shoes:
id=shoe.ShoesId
result=getOfficial.getSizePrice(id)
sizes=result["sizes"]
price=result["price"]
for i in range(len(sizes)):
officialSoldPrice.objects.create(ShoesId=id,size=sizes[i],date=timezone.now(),price=price[i])
# return render(request,"home.html")
# 注册定时任务并开始
register_events(scheduler)
scheduler.start()
然后报出如下错误:
django.core.exceptions.ImproperlyConfigured: The included URLconf 'get.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.
错误在于这个函数的参数saveOfficialPriceToSql(request)
,下面详解一下request参数:
request参数详解
django的urls函数格式是这样的:url(r^/account/$', views.index, name=index)
,它可以接收四个参数,分别是两个必选参数:regex、view和两个可选参数:kwargs、name。
regex代表一个正则表达式,不再细说。
Django匹配正则表达式成功后,就会找到相应的视图函数,Django始终用HttpRequest对象作为第一个参数传递给视图函数,也就我们这里用来承接的request。
错误原因说明
django在匹配正则表达式成功后,会发送HttpRequest对象。但是我们这里想要的是做一个定时任务,其在运行服务器python manage.py runserver
时就已经在开始执行该函数了,没有urls也就没有HttpRequest对象,所以我们根本不需要参数。
正确做法
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用默认的DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 每隔半个小时执行这个任务
@register_job(scheduler, 'interval', id='saveOfficialPriceToSql', minutes=5)
def saveOfficialPriceToSql():
print("现在时间是:",timezone.now())
#userName = request.session.get('user_name', None)
# 一共有ShoesId,size,date,price四个字段要存储
# 读取相应用户所需要爬取的商品id
userName="fgx"
shoes=Shoes.objects.all()
print(type(shoes))
for shoe in shoes:
id=shoe.ShoesId
result=getOfficial.getSizePrice(id)
sizes=result["sizes"]
price=result["price"]
for i in range(len(sizes)):
officialSoldPrice.objects.create(ShoesId=id,size=sizes[i],date=timezone.now(),price=price[i])
# return render(request,"home.html")
# 注册定时任务并开始
register_events(scheduler)
scheduler.start()
网友评论