目录
- 前言
- 分析思路
- 数据储存
- 代码
- 结果展示
- 结语
前言
竞彩足球是目前比较受欢迎的一种体彩彩种,玩法较为灵活多样,赔率可观,今天就来记录一下如何抓取竞彩足球的开奖信息和赔率。
分析思路
我使用的网站为500彩票,我们以2021年6月9日的比赛结果为例,该天的比赛结果地址为https://trade.500.com/jczq/?date=2021-06-09,打开网页右键对第一场比赛结果进行审查元素操作,发现比赛的信息和结果储存在tbody下的tr class="bet-tb-tr bet-tb-end"中,那接下来我们对每一场比赛的tr进行分析。
打开第一个tr我们发现所有的内容均储存在class名称不同的td当中,比如开赛时间就储存在td class="td td-endtime"当中,而赔率则储存在td class="td td-betbtn"下的p标签下的span标签当中,我们所需的数据的储存结构和位置都弄清楚以后下一步就简单了。
我们就可以使用BeautifulSoup的find_all方法获取所有的tr标签下的td标签,然后可以根据td的索引和class的名称获取到对应标签的文本内容。赔率的话可以在储存赔率的td标签下获取获取span标签即可得到所有的赔率,其他的内容基本都是这个思路只是层数和标签名称不同而已,具体获取方式有很多种,大家可以灵活使用,这里就不一一列举了。
数据储存
数据的储存我使用的是pandas模块,获取的到数据首先临时储存在字典中,接着将字典转换为pandas的DataFrame数据类型,最后使用merge进行合并和储存为xlsx文件。
数据储存这个部分应该有更加高明和简便的方法,但是本人对于pandas模块还只是一个初学者,所以过程比较繁琐,欢迎各位指教!
代码
BeautifulSoup模块抓取竞彩足球代码:
#!user/bin/env python
#_*_ coding:utf-8 _*_
#_*_ author:taojinwen _*_
import requests,time
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://trade.500.com/jczq/?date=2021-06-09'
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
respones = requests.get(url,headers = header)
content = respones.content.decode('gbk')
soup = BeautifulSoup(respones.text,'lxml')
trs = soup.find_all('tr',class_="bet-tb-tr")
index = []
#columns = ['让球','胜','平','负']
data = {'让球':'','胜':'','平':'','负':''}
title = {'编号':'','赛事':'','开赛时间':'','主队 VS 客队':'','百家平均':''}
serial_numbers = []
game_names = []
game_times = []
team_names = []
victory = []
flat = []
defeat = []
for tr in trs:tds = tr.find_all('td')#编号':'','赛事':'','开赛时间':'','主队 VS 客队#每次增加一个空值是为了后期方便合并serial_number = tds[0].text.strip('\n')serial_numbers.extend((serial_number,''))game_name = tds[1].text.strip('\n')game_names.extend((game_name,''))game_time = tds[2].textgame_times.extend((game_time,''))team_name = tds[3].text.replace('\n','')team_names.extend((team_name,''))#让球p = tds[4].find_all('p')p1 = p[0].textp2 = p[1].textindex.extend((p1,p2))#赔率span = tds[5].find_all('span')if len(span) == 6:#同时加载多个元素到列表victory.extend((span[0].text,span[3].text))flat.extend((span[1].text,span[4].text))defeat.extend((span[2].text,span[5].text))else:victory.extend(('未开售', span[0].text))flat.extend(('未开售', span[1].text))defeat.extend(('未开售', span[2].text))
data['让球'] = index
data['胜'] = victory
data['平'] = flat
data['负'] = defeat
title['编号'] = serial_numbers
title['赛事'] = game_names
title['开赛时间'] = game_times
title['主队 VS 客队'] = team_names
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(title)
now = time.time()
ls = time.localtime(now)
time = str(ls.tm_mon)+'_'+str(ls.tm_mday)+'_'+str(ls.tm_hour)+'_'+str(ls.tm_min)+'_'+str(ls.tm_sec)
df = pd.merge(df2,df1,how="inner",left_index=True,right_index=True)
df.to_excel('table{}.xlsx'.format(time))
结果展示
最终在excel表里面看起来不是很美观,细节方面还需进行美化,凑合着先看一下吧!
结语
如果想抓取多天比赛结果的朋友,可以分析每天赛果url的变化规律,在外面增加一个循环逐天进行抓取!最后欢迎大家在评论区不吝赐教,谢谢!