class IndexSpider(object): def __init__(self, name): self.name = name self.redis = Redis_Pool() self.mongo_index = MongoDB('football_index') # 创建队列和协程池 self.queue = Queue() self.coroutine_pool = Pool() def __chech_callbake(self, temp): '''异步回调函数''' if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) def get_eventID(self): datas = self.redis.find(self.name) for k, v in datas.items(): msg = eval(v.decode("utf-8")) eventID = msg['赛事ID'] self.queue.put(eventID) # self.run() # 异步调用 for i in range(100): if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) # 守护线程 self.coroutine_pool.join() def __get_data(self): proxy = get_ip() if not self.queue.empty(): eventID = self.queue.get() msg = {'msg': []} msg['赛事ID'] = eventID if proxy: response = requests.get( f'https://live.leisu.com/3in1-{str(eventID)}', proxies={ 'http': 'https://' + proxy }, headers=HEADERS, allow_redirects=False).text else: response = requests.get( f'https://live.leisu.com/3in1-{str(eventID)}', headers=HEADERS, allow_redirects=False).text html = etree.HTML(response) datas = html.xpath('/html/body/div[1]/div[3]//tr')[1:] for data in datas: name = data.xpath('./td[2]/span[2]/text()')[0].strip() if not name: name = 'Bet365' # name = 'https:' + data.xpath('./td[2]/span[2]/img/@src')[0].strip() # 欧指 ouzhi_1 = data.xpath('./td[3]/div[1]/span/text()') # 主胜 if not ouzhi_1: ouzhi_1 = ['', '', ''] ouzhi_2 = data.xpath( './td[3]/div[2]/span/span/span/text()') # 主胜 if not ouzhi_2: ouzhi_2 = ['', '', ''] # 让球 rangqiu_1 = data.xpath('./td[4]/div[1]/span/text()') if not rangqiu_1: rangqiu_1 = ['', '', ''] rangqiu_2 = data.xpath('./td[4]/div[2]/span/span/span/text()') if not rangqiu_2: rangqiu_2 = ['', ''] rangqiu_3 = data.xpath('./td[4]/div[2]/span/span[2]/text()') if not rangqiu_3: rangqiu_3 = [''] # 进球数 jiqiushu_1 = data.xpath('./td[5]/div[1]/span/text()') if not jiqiushu_1: jiqiushu_1 = ['', '', ''] jiqiushu_2 = data.xpath('./td[5]/div[2]/span/span/span/text()') if not jiqiushu_2: jiqiushu_2 = ['', ''] jiqiushu_3 = data.xpath('./td[5]/div[2]/span/span[2]/text()') if not jiqiushu_3: jiqiushu_3 = [''] dic = {f'{name}': [{'欧指': {'主胜': [ouzhi_1[0].strip(), ouzhi_2[0].strip()], '和局': [ouzhi_1[1].strip(), ouzhi_2[1].strip()], '客胜': [ouzhi_1[2].strip(), ouzhi_2[2].strip()]}, \ '让球': {'主胜': [rangqiu_1[0].strip(), rangqiu_2[0].strip()], '盘口': [rangqiu_1[1].strip(), rangqiu_3[0].strip()], '客胜': [rangqiu_1[2].strip(), rangqiu_2[1].strip()]}, \ '进球数': {'大球': [jiqiushu_1[0].strip(), jiqiushu_2[0].strip()], '和局': [jiqiushu_1[1].strip(), jiqiushu_3[0].strip()], '小球': [jiqiushu_1[2].strip(), jiqiushu_2[1].strip()]}}]} msg['msg'].append(dic) # 保存数据 if msg['msg']: self.mongo_index.insert_one(msg, '赛事ID') @classmethod def start(cls): def run(): notStart = cls('football_notStart') finished = cls('football_finished') other = cls('football_other') live = cls('football_live') live.get_eventID() notStart.get_eventID() finished.get_eventID() other.get_eventID() # 每隔一段时间执行一次run方法 schedule.every(2).seconds.do(run) while True: schedule.run_pending() time.sleep(1)
class IndexSpider(object): def __init__(self): self.redis = Redis_Pool() self.mongo_index = MongoDB('football_index') # 创建队列和协程池 self.queue = Queue() self.coroutine_pool = Pool() def __chech_callbake(self, temp): '''异步回调函数''' if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) def get_eventID(self, name): datas = self.redis.find(name) for k, v in datas.items(): eventID = eval(k) self.queue.put(eventID) # 异步调用 for i in range(TEST_INDEX_DATA): if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) # 守护线程 self.coroutine_pool.join() def __get_data(self): proxy = get_ip() if not self.queue.empty(): eventID = self.queue.get() msg = {'msg': []} msg['赛事ID'] = eventID if proxy: response = requests.get( f'https://live.leisu.com/3in1-{str(eventID)}', proxies={ 'http': 'https://' + proxy }, headers=HEADERS).text else: response = requests.get( f'https://live.leisu.com/3in1-{str(eventID)}', headers=HEADERS).text html = etree.HTML(response) datas = html.xpath('/html/body/div[1]/div[3]//tr')[1:] for data in datas: name = data.xpath('./td[2]/span[2]/text()')[0].strip() if not name: name = 'Bet365' # name = 'https:' + data.xpath('./td[2]/span[2]/img/@src')[0].strip() # 欧指 ouzhi_1 = data.xpath('./td[3]/div[1]/span/text()') # 主胜 if not ouzhi_1: ouzhi_1 = ['', '', ''] ouzhi_2 = data.xpath( './td[3]/div[2]/span/span/span/text()') # 主胜 if not ouzhi_2: ouzhi_2 = ['', '', ''] # 让球 rangqiu_1 = data.xpath('./td[4]/div[1]/span/text()') if not rangqiu_1: rangqiu_1 = ['', '', ''] rangqiu_2 = data.xpath('./td[4]/div[2]/span/span/span/text()') if not rangqiu_2: rangqiu_2 = ['', ''] rangqiu_3 = data.xpath('./td[4]/div[2]/span/span[2]/text()') if not rangqiu_3: rangqiu_3 = [''] # 进球数 jiqiushu_1 = data.xpath('./td[5]/div[1]/span/text()') if not jiqiushu_1: jiqiushu_1 = ['', '', ''] jiqiushu_2 = data.xpath('./td[5]/div[2]/span/span/span/text()') if not jiqiushu_2: jiqiushu_2 = ['', ''] jiqiushu_3 = data.xpath('./td[5]/div[2]/span/span[2]/text()') if not jiqiushu_3: jiqiushu_3 = [''] dic = {f'{name}': [{'欧指': {'主胜': [ouzhi_1[0].strip(), ouzhi_2[0].strip()], '和局': [ouzhi_1[1].strip(), ouzhi_2[1].strip()], '客胜': [ouzhi_1[2].strip(), ouzhi_2[2].strip()]}, \ '让球': {'主胜': [rangqiu_1[0].strip(), rangqiu_2[0].strip()], '盘口': [rangqiu_1[1].strip(), rangqiu_3[0].strip()], '客胜': [rangqiu_1[2].strip(), rangqiu_2[1].strip()]}, \ '进球数': {'大球': [jiqiushu_1[0].strip(), jiqiushu_2[0].strip()], '和局': [jiqiushu_1[1].strip(), jiqiushu_3[0].strip()], '小球': [jiqiushu_1[2].strip(), jiqiushu_2[1].strip()]}}]} msg['msg'].append(dic) # 保存数据 if msg['msg']: self.mongo_index.insert_one(msg, '赛事ID') def today_index(self): threads = [] threads.append( threading.Thread(target=self.get_eventID, args=('football_live', ))) threads.append( threading.Thread(target=self.get_eventID, args=('football_notStart', ))) threads.append( threading.Thread(target=self.get_eventID, args=('football_finished', ))) threads.append( threading.Thread(target=self.get_eventID, args=('football_other', ))) # 开启线程 for thread in threads: thread.start() # 守护线程 for thread in threads: thread.join() def not_today_index(self): threads = [] threads.append( threading.Thread(target=self.get_eventID, args=('football_history_events', ))) threads.append( threading.Thread(target=self.get_eventID, args=('football_future_events', ))) # 开启线程 for thread in threads: thread.start() # 守护线程 for thread in threads: thread.join() def run(self): self.today_index() if time.strftime('%H', time.localtime(time.time())) == '00': self.not_today_index() else: pass @classmethod def start(cls): st = cls() st.run() st.not_today_index() # 每隔一段时间执行一次run方法 schedule.every(10).seconds.do(st.run) while True: schedule.run_pending() time.sleep(1)
class DataSpider(object): def __init__(self, name): self.name = name self.redis = Redis_Pool() self.mongo_home_page = MongoDB('home_page') self.mongo = { 'historical': MongoDB('football_historical'), 'recent-record': MongoDB('football_recent'), 'since-trend': MongoDB('football_trend'), 'injury-situation': MongoDB('football_situation'), 'league-points': MongoDB('football_league_points') } # 创建队列和协程池 self.queue = Queue() self.coroutine_pool = Pool() def __chech_callbake(self, temp): '''异步回调函数''' if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) def get_events_ID(self): datas = self.redis.find(self.name) for k, v in datas.items(): msg = eval(v.decode("utf-8")) self.queue.put((msg['赛事ID'], 'historical')) self.queue.put((msg['赛事ID'], 'recent-record')) self.queue.put((msg['赛事ID'], 'since-trend')) self.queue.put((msg['赛事ID'], 'injury-situation')) self.queue.put((msg['赛事ID'], 'league-points')) for i in range(TEST_PROXIES_ASYNC_COUNT): if not self.queue.empty(): self.coroutine_pool.apply_async(self.__get_data, callback=self.__chech_callbake) # time.sleep(2) # 守护线程 self.coroutine_pool.join() def __get_data(self): proxy = get_ip() if not self.queue.empty(): events_ID, ball = self.queue.get() # 分析页面 try: if proxy: resp = requests.get('https://live.leisu.com/shujufenxi-' + str(events_ID), proxies={ 'https': 'https://' + proxy, 'http': 'http://' + proxy }, headers=HEADERS, allow_redirects=False).text else: resp = requests.get('https://live.leisu.com/shujufenxi-' + str(events_ID), headers=HEADERS, allow_redirects=False).text if ball == 'since-trend': self.__get_trend(resp, events_ID, ball) elif ball == 'injury-situation': self.__get_situation(resp, events_ID, ball) elif ball == 'league-points': self.__get_league_points(resp, events_ID, ball) else: self.__get_historical(ball, events_ID, resp) # 调度队列的tesk_done方法 self.queue.task_done() except requests.exceptions.ProxyError: pass def __get_historical(self, ball, events_ID, resp): try: if ball == 'historical': result = re.findall( '<div id="historical"[\s\S]*?(<tr[\s\S]*?</td>)</tr></table>', resp)[0] else: result = re.findall( '<div id="recent-record"[\s\S]*?(<tr[\s\S]*?</td>)</tr></table>', resp)[0] html = etree.HTML(result) datas = html.xpath('//tr')[1:] dict_data = {'data': []} # 赛事ID dict_data['赛事ID'] = events_ID for data in datas: dic = {} # 赛事 event_1 = data.xpath('./td[1]/a/text()') if event_1: dic['赛事'] = event_1[0].strip() else: dic['赛事'] = '' # 时间 time_1 = data.xpath('./td[2]/text()') if time_1: dic['时间'] = time_1[0].strip() else: dic['时间'] = '' # 主场球队 home_team_1 = data.xpath('./td[3]/a/span/text()') if home_team_1: dic['主场球队'] = home_team_1[0].strip() else: dic['主场球队'] = '' # 比分 score = data.xpath('./td[4]/a/span/text()') if score: dic['比分'] = score[0] + ':' + score[1] else: dic['比分'] = '' # 客场球队 away_team_1 = data.xpath('./td[5]/a/span/text()') if away_team_1: dic['客场球队'] = away_team_1[0].strip() else: dic['客场球队'] = '' # 半场 half_score = data.xpath('./td[6]/text()') if half_score: dic['半场'] = half_score[0].strip() else: dic['半场'] = '' # 半角 lab_corner = data.xpath('./td[7]/text()') if lab_corner: dic['半角'] = lab_corner[0].strip() else: dic['半角'] = '' # 胜负 win = data.xpath('./td[8]/span/text()') if win: dic['胜负'] = win[0].strip() else: dic['胜负'] = '' # 欧指 europe = data.xpath('./td[9]/div/div/text()') if europe: dic['欧指'] = europe[0].strip() else: dic['欧指'] = '' # 让球 rangqiu = data.xpath('./td[10]/div/div/text()') if rangqiu: dic['让球'] = rangqiu[0].strip() else: dic['让球'] = '' # 盘数 panlu = data.xpath('./td[11]/span/text()') if panlu: dic['盘数'] = panlu[0].strip() else: dic['盘数'] = '' # 进球 jinqiu = data.xpath('./td[12]/span/text()') if jinqiu: dic['进球'] = jinqiu[0].strip() else: dic['进球'] = '' dict_data['data'].append(dic) # 保存数据 if dict_data['data']: self.mongo[ball].insert_one(dict_data, '赛事ID') except: pass def __get_trend(self, resp, events_ID, ball): html = etree.HTML(resp) datas = html.xpath('//div[@id="since-trend"]/div[2]/div') dic = {'mgs': []} dic['赛事ID'] = events_ID for data in datas: team_name = data.xpath('.//span[@class="name"]/text()')[0] messages = data.xpath('.//tr')[2:] mgs_dic = {'mgs': []} mgs_dic['队名'] = team_name for mes in messages: mgs = {} # 类型 stye = mes.xpath('./td[1]/text()') if stye: mgs['类型'] = stye[0] else: mgs['类型'] = '' # 比赛 game = mes.xpath('./td[2]/text()') if game: mgs['比赛'] = game[0] else: mgs['比赛'] = '' # 赢盘 winpan = mes.xpath('./td[3]/text()') if winpan: mgs['赢盘'] = winpan[0] else: mgs['赢盘'] = '' # 走盘 zoupan = mes.xpath('./td[4]/text()') if zoupan: mgs['走盘'] = zoupan[0] else: mgs['走盘'] = '' # 输盘 shupan = mes.xpath('./td[5]/text()') if shupan: mgs['输盘'] = shupan[0] else: mgs['输盘'] = '' # 赢盘率 yingpanlv = mes.xpath('./td[6]/text()') if yingpanlv: mgs['赢盘率'] = yingpanlv[0] else: mgs['赢盘率'] = '' # 大球 bigball = mes.xpath('./td[7]/text()') if bigball: mgs['大球'] = bigball[0] else: mgs['大球'] = '' # 大球率 bigballpor = mes.xpath('./td[8]/text()') if bigballpor: mgs['大球率'] = bigballpor[0] else: mgs['大球率'] = '' # 小球 litterball = mes.xpath('./td[9]/text()') if litterball: mgs['小球'] = litterball[0] else: mgs['小球'] = '' # 小球率 litterballpor = mes.xpath('./td[10]/text()') if litterballpor: mgs['小球率'] = litterballpor[0] else: mgs['小球率'] = '' mgs_dic['mgs'].append(mgs) dic['mgs'].append(mgs_dic) # 保存数据 if dic['mgs']: self.mongo[ball].insert_one(dic, '赛事ID') def __get_situation(self, resp, events_ID, ball): html = etree.HTML(resp) # 伤停情况 datas = html.xpath('//div[@id="injury-situation"]/div[2]/div') msg_dic = {'msg': []} msg_dic['赛事ID'] = events_ID def __message(): global dic, name, location, case, start_time, back_time, field_count dic = {} name = info.xpath('./td[1]/a/span/text()') if name: dic['球员'] = name[0] else: dic['球员'] = '' location = info.xpath('./td[2]/text()') if location: dic['位置'] = location[0] else: dic['位置'] = '' case = info.xpath('./td[3]/text()') if case: dic['原因'] = case[0] else: dic['原因'] = '' start_time = info.xpath('./td[4]/text()') if start_time: dic['开始时间'] = start_time[0] else: dic['开始时间'] = '' back_time = info.xpath('./td[5]/text()') if back_time: dic['归队时间'] = back_time[0] else: dic['归队时间'] = '' field_count = info.xpath('./td[6]/text()') if field_count: dic['影响场数'] = field_count[0] else: dic['影响场数'] = '' return dic for data in datas: team_name = data.xpath('.//span[@class="name"]/text()') infos = data.xpath('.//tr')[1:] msg = {'msg': {'伤病': [], '停赛': []}} if team_name: msg['队名'] = team_name[0] else: msg['队名'] = '' for info in infos: if not info.xpath('./td[@colspan="6"]'): if 'td-pd' in info.xpath('./@class')[0]: dic = __message() msg['msg']['伤病'].append(dic) else: dic = __message() msg['msg']['停赛'].append(dic) msg_dic['msg'].append(msg) # 保存数据 if msg_dic['msg']: self.mongo[ball].insert_one(msg_dic, '赛事ID') def __get_league_points(self, resp, events_ID, ball): html = etree.HTML(resp) # 联赛积分 datas = html.xpath('//div[@id="league-points"]/div[2]/div') msg = {'msg': []} msg['赛事ID'] = events_ID for data in datas: dic_msg = {'msg': []} team_name = data.xpath('./div[1]/div/a/span/text()') event = data.xpath('./div[1]/div/div/text()') if team_name and event: name = team_name[0] + event[0] else: name = '' dic_msg['队名'] = name infos = data.xpath('.//tr')[1:] for info in infos: dic = {} type = info.xpath('./td[1]/text()') if type: dic['类型'] = type[0] else: dic['类型'] = '' changshu = info.xpath('./td[2]/text()') if changshu: dic['比赛场数'] = changshu[0] else: dic['比赛场数'] = '' win_count = info.xpath('./td[3]/text()') if win_count: dic['胜场数'] = win_count[0] else: dic['胜场数'] = '' fail_count = info.xpath('./td[4]/text()') if fail_count: dic['负场数'] = fail_count[0] else: dic['负场数'] = '' ping_count = info.xpath('./td[5]/text()') if ping_count: dic['平数'] = ping_count[0] else: dic['平数'] = '' jinqiu = info.xpath('./td[6]/text()') if jinqiu: dic['进球'] = jinqiu[0] else: dic['进球'] = '' shiqiu = info.xpath('./td[7]/text()') if shiqiu: dic['失球'] = shiqiu[0] else: dic['失球'] = '' jingqiushu = info.xpath('./td[8]/text()') if jingqiushu: dic['进球率'] = jingqiushu[0] else: dic['进球率'] = '' jifen = info.xpath('./td[9]/text()') if jifen: dic['积分'] = jifen[0] else: dic['积分'] = '' paiming = info.xpath('./td[10]/text()') if paiming: dic['排名'] = paiming[0] else: dic['排名'] = '' shenglv = info.xpath('./td[11]/text()') if shenglv: dic['胜率'] = shenglv[0] else: dic['胜率'] = '' dic_msg['msg'].append(dic) msg['msg'].append(dic_msg) # 保存数据 if msg['msg']: self.mongo[ball].insert_one(msg, '赛事ID') @classmethod def start(cls): def run(): live = cls('football_live') live.get_events_ID() notStart = cls('football_notStart') notStart.get_events_ID() finished = cls('football_finished') finished.get_events_ID() other = cls('football_other') other.get_events_ID() run() # 每隔一段时间执行一次run方法 schedule.every(TEST_EVENTS_INTERVAL).seconds.do(run) while True: schedule.run_pending() time.sleep(1)
class HomePage(object): def __init__(self): # 建立数据库连接 self.mongo = MongoDB('football_info') self.redis = Redis_Pool() # 创建队列和协程池 self.queue = Queue() self.coroutine_pool = Pool() def __chech_callbake(self, temp): '''异步回调函数''' if not self.queue.empty(): self.coroutine_pool.apply_async(self.__dispose_one_data, callback=self.__chech_callbake) def get_data(self, name): live = self.redis.find(name) for k, v in live.items(): ID = eval(k) self.queue.put(ID) for i in range(TEST_HOME_ASYNC_COUNT): if not self.queue.empty(): self.coroutine_pool.apply_async(self.__dispose_one_data, callback=self.__chech_callbake) # time.sleep(2) # 守护线程 self.coroutine_pool.join() def __dispose_one_data(self): proxy = get_ip() if not self.queue.empty(): ID = self.queue.get() # 用于储存数据的 # 文字直播及图片内信息 info = self._text_broadcast(ID) # 球队信息 info['球队信息'] = self._teams_info(ID) # 插入赛事ID info['赛事ID'] = ID self.mongo.insert_one(info, '赛事ID') def _text_broadcast(self, ID): res = requests.get( 'https://api.namitiyu.com/v1/football/match/detail?sid={}'.format( ID)).json() msg = {} if res: # 文字解说 datas = res['event'] for data in datas: data['data'] = data['data'].replace('雷速体育', '我们') # 插入文字解说 msg['文字解说'] = datas if res['stats']: # 赛场内容 corner = res['stats'][0] # 角球 yellow_card = res['stats'][1] # 黄牌 red_card = res['stats'][2] # 红牌 dianqiu = res['stats'][3] # 点球 shezheng = res['stats'][4] # 射正 shemen = res['stats'][5] # 射门 for k, v in shezheng.items(): shemen[k] += shezheng[k] jingong = res['stats'][6] # 进攻 weixianjingong = res['stats'][7] # 危险进攻 kongqiulv = res['stats'][8] # 控球率 msg['赛场内容'] = { '角球': corner, '黄牌': yellow_card, '红牌': red_card, '点球': dianqiu, '射正': shezheng, '射门': shemen, '进攻': jingong, '危险进攻': weixianjingong, '控球率': kongqiulv } else: msg['赛场内容'] = '暂无信息' # 返回数据 return msg def _teams_info(self, ID): res = requests.get( 'https://api.namitiyu.com/v1/football/match/lineup?tid=1&sid={}'. format(ID)).json() msg = {'home': {}, 'away': {}} # 左队信息 if res: for datas in res['lineup']['home'][1:]: for data in datas: if data[2]: data[2] = 'https:////cdn.leisu.com/avatar/' + data[2] msg['home']['msg'] = res['lineup']['home'] # 右队信息 for datas in res['lineup']['away'][1:]: for data in datas: if data[2]: data[2] = 'https:////cdn.leisu.com/avatar/' + data[2] msg['away']['msg'] = res['lineup']['away'] else: msg = '暂无信息' return msg def today_index(self): threads = [] threads.append( threading.Thread(target=self.get_data, args=('football_live', ))) threads.append( threading.Thread(target=self.get_data, args=('football_notStart', ))) threads.append( threading.Thread(target=self.get_data, args=('football_finished', ))) threads.append( threading.Thread(target=self.get_data, args=('football_other', ))) # 开启线程 for thread in threads: thread.start() # 守护线程 for thread in threads: thread.join() def not_today_index(self): threads = [] threads.append( threading.Thread(target=self.get_data, args=('football_history_events', ))) threads.append( threading.Thread(target=self.get_data, args=('football_future_events', ))) # 开启线程 for thread in threads: thread.start() # 守护线程 for thread in threads: thread.join() def run(self): self.today_index() if time.strftime('%H', time.localtime(time.time())) == '00': self.not_today_index() else: pass @classmethod def start(cls): st = cls() st.not_today_index() while True: st.today_index()
class HomePage(object): def __init__(self, name): self.name = name # 建立数据库连接 self.mongo = MongoDB('football_home_page') self.redis = Redis_Pool() # 创建队列和协程池 self.queue = Queue() self.coroutine_pool = Pool() def __chech_callbake(self, temp): '''异步回调函数''' if not self.queue.empty(): self.coroutine_pool.apply_async(self.__dispose_one_data, callback=self.__chech_callbake) def get_data(self): live = self.redis.find(self.name) threads = [] for k, v in live.items(): # self.__dispose_one_data(events, li, teams) msg = eval(v.decode("utf-8")) self.queue.put(msg) for i in range(TEST_HOME_ASYNC_COUNT): if not self.queue.empty(): self.coroutine_pool.apply_async(self.__dispose_one_data, callback=self.__chech_callbake) # time.sleep(2) # 守护线程 self.coroutine_pool.join() def __dispose_one_data(self): proxy = get_ip() if not self.queue.empty(): msg = self.queue.get() try: if proxy: response = requests.get('https://live.leisu.com/detail-' + str(msg['赛事ID']), proxies={ 'https': 'https://' + proxy }, headers=HEADERS, allow_redirects=False).text else: response = requests.get('https://live.leisu.com/detail-' + str(msg['赛事ID']), headers=HEADERS, allow_redirects=False).text # print(response) # 文字解说 narrate_ = re.findall('EVENT=(.*?])', response) if narrate_: narrate = narrate_[0].replace('雷速体育', '我们') else: narrate = '' html = etree.HTML(response) # 比分 try: score = f'''{html.xpath('//div[@class="score home"]/text()')[0]}-{html.xpath('//div[@class="score away"]/text()')[0]}''' except: score = '' # 半场 half_score_ = html.xpath('//span[@class ="half-score"]/text()') if half_score_: half_score = half_score_[0] else: half_score = '' # 角球 lab_data = html.xpath( '//span[@class="lab corner"]/span[@class="text"]/text()') if lab_data: lab_corner = lab_data[0] + '-' + lab_data[1] else: lab_corner = '' msg['半场'] = half_score msg['角球'] = lab_corner msg['解说'] = narrate self.mongo.insert_one(msg, '赛事ID') except requests.exceptions.ProxyError: pass @classmethod def start(cls): def run(): notStart = cls('football_notStart') finished = cls('football_finished') other = cls('football_other') live = cls('football_live') live.get_data() notStart.get_data() finished.get_data() other.get_data() run() # 每隔一段时间执行一次run方法 schedule.every(2).seconds.do(run) while True: schedule.run_pending() time.sleep(1)