首先创建一个python文件demo1.py,这里我是定时每天的15:30爬取指定网站。注意要是设置时区,否则会导致爬取时间不对。
# く__,.ヘヽ. / ,ー、 〉
# \ ', !-─‐-i / /´
# /`ー' L//`ヽ、
# / /, /| , , ',
# イ / /-‐/ i L_ ハ ヽ! i
# レ ヘ 7イ`ト レ'ァ-ト、!ハ| |
# !,/7 '0' ´0iソ| |
# |.从" _ ,,,, / |./ |
# レ'| i>.、,,__ _,.イ / .i |
# レ'| | / k_7_/レ'ヽ, ハ. |
# | |/i 〈|/ i ,.ヘ | i |
# .|/ / i: ヘ! \ |
# kヽ>、ハ _,.ヘ、 /、!
# !'〈//`T´', \ `'7'ーr'
# レ'ヽL__|___i,___,ンレ|ノ
# ト-,/ |___./
# 'ー' !_,.:
import requests
from celery import Celery
from celery.schedules import crontab
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
uri = 'redis://:@127.0.0.1:6379/2'
uri1 = 'redis://:@127.0.0.1:6379/3'
app = Celery('demo1', broker=uri, backend=uri1)
@app.task
def task2(page=1, a='init', node='sh_a'):
url = 'http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData'
para = {
'page': page,
'num': 40,
'sort': 'symbol',
'asc': 1,
'symbol': '',
'_s_r_a': a,
'node': node
}
res = requests.get(url, headers=headers, params=para)
data = res.json()
return data
app.conf.beat_schedule = {
'send_everyday_pm_3:30': {
'task': 'demo1.task2',
'schedule': crontab(minute='30', hour='15'),
'args': ()
}
}
app.conf.enable_utc = False
app.conf.timezone = 'Asia/Shanghai'
然后再创建一个模块用于从数据库查出数据demo2.py
# く__,.ヘヽ. / ,ー、 〉
# \ ', !-─‐-i / /´
# /`ー' L//`ヽ、
# / /, /| , , ',
# イ / /-‐/ i L_ ハ ヽ! i
# レ ヘ 7イ`ト レ'ァ-ト、!ハ| |
# !,/7 '0' ´0iソ| |
# |.从" _ ,,,, / |./ |
# レ'| i>.、,,__ _,.イ / .i |
# レ'| | / k_7_/レ'ヽ, ハ. |
# | |/i 〈|/ i ,.ヘ | i |
# .|/ / i: ヘ! \ |
# kヽ>、ハ _,.ヘ、 /、!
# !'〈//`T´', \ `'7'ーr'
# レ'ヽL__|___i,___,ンレ|ノ
# ト-,/ |___./
# 'ー' !_,.:
import json
from redis import StrictRedis
r = StrictRedis('127.0.0.1', 6379, db=3, password='')
data = r.keys()[0]
data = r.get(data)
print(json.loads(data))
模块写好了以后让celery开始等待任务,打开控制台,确定在demo1所在的目录,然后在控制台执行celery -A demo1 worker -l info -P eventlet,接着再打开一个控制台确定在demo1所在的目录,执行celery -A demo1 beat,这样到达时间就会进行爬取数据。在此之前请先安装程序中用到的包。