前言
在上文中我们主要定义了两个数据库,一个是存储表mysql的存储设置,还有一个就是redis初始化设置,包括取数据,计数等功能函数的设置。没有看过的小伙伴请移步打造一个轻量级分布式企业基本信息采集框架(二),本文主要对如何实现调度器,对url进行调度以及设置。
正文
调度器的实现就比较简单了,简单说下大概逻辑。首先我们对zset集合内status为0的keywords取出来,因为请求是post请求,构造data,传入下载器。在这之前,我们会先判断zset集合内有没有数据,如果没有的话,我这边是默认的从数据表内获取数据,也就是上文提到的connect_db这个函数。
下面看下代码的实现
# -*- coding: utf-8 -*-
from config import *
from utils import *
from db_connect import RedisDbConn,DbCollect
from loguru import logger
from cutent import *
import sys
from crawl_spider import *
class EpregAppCollect(object):
def __init__(self):
self.client = RedisDbConn()
self.db = DbCollect()
self.init_status = INIT_STATUS
self.cut = CutEntername()
def entry_data(self):
"""
将原有的数据库内的keywords放进redis有序集合中
:return:
"""
keywords_list = self.db.connect_db()
for keyword in keywords_list:
self.client.initial_set(keyword)
def run(self):
try:
count = self.client.get_count(self.init_status)
logger.info("目前还剩余~~~~" + str(count) + "个keywords未采集哦...")
for i in range(count):
keyword_list = self.client.get_data(self.init_status)
if keyword_list:
for params in CrawlUrl().get_params(keyword_list):
self.cut.cutentername(params["entName"])
sys.stdout.flush()
time.sleep(random.randint(2, 5))
except Exception as e:
logger.debug("采集脚本发生错误" + str(e.args))
将这些代码放入crawl_basicinfo.py内,run()函数是这个脚本的开始,因为redis内已经有数据,我就没有再添加数据了,自己可以自行设置,得到keyword以后,我们将其传入到CrawlUrl这个类的get_params函数,这个函数的作用就是构造请求data,如下:
def get_params(self, datalist):
"""
构造请求参数
:param datalist:
:return:
"""
for keyword in datalist:
params = {"searchword": "%s" % keyword.decode(),
"conditions": {"excep_tab": "0", "ill_tab": "0", "area": "%s" % AREA, "cStatus": "0", "xzxk": "0",
"xzcf": "0", "dydj": "0"}, "sourceType": "I"}
data = json.dumps(params, ensure_ascii=False).encode("utf-8")
for req_param in self.collect_data(data,keyword.decode()):
yield req_param
这样子一个简单的调度器就完成了,其实吧也算不上什么调度器,就是函数之间的传参、返回而已。感兴趣的小伙伴可以自己尝试写一下,我们下篇文章再见。打造一个轻量级分布式企业基本信息采集框架(四)