php抓取开奖网页内容(:利用浏览器的开发者工具分析源码(中英对照))
优采云 发布时间: 2022-01-04 13:12php抓取开奖网页内容(:利用浏览器的开发者工具分析源码(中英对照))
仔细查看 URL 中的更改。让我们大胆猜测一下,我们需要的数据存储在以下互联网路径中:URL+_+页码+.html。
验证下试试。目前,这里显示了113页,所以我不妨尝试访问:
答对了。
然后按照这个真实的 URL 来抓取数据。
第三步:使用浏览器的开发者工具分析源码
我们需要的数据存储在:
在第 4 个标签之后的标签下;标签收录:开奖日期/期号/蓝色中奖号码/红色中奖号码等信息。
第四步:编写python代码
代码示例:
#!python3
导入请求,bs4
def GetWinningInfo(网址):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,'html.parser')
resultinfo_qishu = htmlinfo.select('td')
resultinfo_haoma = htmlinfo.select('em')
#包括每期的期数;抽奖日期和其他信息
resultinfo_haomalist = str(resultinfo_haoma).replace('','').replace('','').replace('','').replace('[','').replace(')', '')。分裂(',')
打印(len(resultinfo_qishu))
对于范围内的 i(0,len(resultinfo_qishu)-1,7):
对于范围内的 j(0,2):
如果 j == 0:
print('绘图日期:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
别的:
print('问题编号:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
x = []
对于范围内的 n(0,7):
x.append(resultinfo_haomalist[i+n])
print('红球:%s,%s,%s,%s,%s,%s;蓝球:%s'%(x[0],x[1],x[2],x[3 ],x[4],x[5],x[6]))
#主要的
#TODO:获取总页数
GetWinningInfo('')
以上代码目前只实现了第一页数据的正确获取,并将获取的结果显示在屏幕上;到目前为止,这个项目仍然对现实生活没有影响;当然,技术死傻欢乐除外~~~
因此,为了让大多数人从这个项目中受益,并由衷地欣赏我们的超能力,我们需要多思考,做得更好。
例如:读取过去的所有数据;将读取的数据保存在excel中;然后按照人的逻辑对数据进行分析,将分析结果用图表等方式展示出来……
第 4 步:那么让我们开始吧
首先,我们可以捕获所有以前的数据:
例子二:
#!python3
导入请求,bs4
def GetWinningInfo(网址):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,'html.parser')
resultinfo_qishu = htmlinfo.select('td')
resultinfo_haoma = htmlinfo.select('em')
#包括每期的期数;抽奖日期和其他信息
resultinfo_haomalist = str(resultinfo_haoma).replace('','').replace('','').replace('','').replace('[','').replace(')', '')。分裂(',')
打印(len(resultinfo_qishu))
发行者数据 = []
对于范围内的 i(0,len(resultinfo_qishu)-1,7):
发行人数据 = []
对于范围内的 j(0,2):
如果 j == 0:
#print('绘图日期:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
a = str(resultinfo_qishu[i+j]).replace('
','')。代替('
','')
issuerData.append(a)
别的:
#print('问题编号:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
b = str(resultinfo_qishu[i+j]).replace('
','')。代替('
','')
issuerData.append(b)
x = []
对于范围内的 n(0,7):
x.append(resultinfo_haomalist[i+n])
#print('红球: %s,%s,%s,%s,%s,%s; 蓝球: %s'% (x[0],x[1],x[2],x [ 3],x[4],x[5],x[6]))
issuerData.append(x)
issuerDatas.append(issuerData)
返回 issuerDatas
#主要的
#TODO:获取总页数
numberOfPages = 113 #有兴趣的可以尝试从网站获取这个号码。
baseWebAddress = ""
对于范围内的 e(1,numberOfPages+1):
print('--------这是页面 %s--------'% e)
realWebAddress = baseWebAddress +'/list_'+ str(e) +'.html'
resultall = GetWinningInfo(realWebAddress)
对于结果中的每个IssuerData:
#print(everyIssuerData)
打印('[绘制日期]: %s'% everyIssuerData[0])
打印('[问题编号]:%s'% everyIssuerData[1])
打印('[中奖号码]')
print('红球:%s,%s,%s,%s,%s,%s;蓝球:%s'%(everyIssuerData[2][0],everyIssuerData[2][1],everyIssuerData[ 2][2],everyIssuerData[2][3],everyIssuerData[2][4],everyIssuerData[2][5],everyIssuerData[2][6]))
以上代码实现了在屏幕上获取并打印以往所有开奖历史信息的功能;接下来我们意识到将获得的数据写入文件。
在开始下一步之前,需要掌握一些基本的python操作Excel文件的方法;在这里我们添加一个小插曲;一起学习这个内容。(然后让我们添加另一个步骤。)
第五步:学习如何使用Python操作Excel(插曲)
学习使用 Python 处理 Excel 文件。这里主要用到xlrd和xlwt模块,使用前需要安装!一般需要pip安装。(这不是吗?检查谷歌。)
xlrd(excel读取)用于读取Excel文件,xlwt(excel写入)用于生成Excel文件(可以控制Excel中单元格的格式)。需要注意的是,用xlrd读取excel是不能操作的:xlrd.open_workbook()方法返回的是xlrd.Book类型,该类型是只读的,不能操作。xlwt.Workbook()返回的xlwt.Workbook类型的save(filepath)方法可以保存excel文件。
因此,读取和生成Excel文件的处理非常容易,但修改现有的Excel文件就比较麻烦。不过也有一个xlutils(取决于xlrd和xlwt)提供复制excel文件内容和修改文件的功能。实际上,它只是 xlrd.Book 和 xlwt.Workbook 之间的一个管道。
PS:xlwt、wlrd只能读写xls文件,不能操作xlsx文件
因此,我们需要使用openpyxl;安装非常简单,也使用了pip。(openpyxl只能操作xlsx文件不能操作xls文件)
如果您还有图表需求,那么您可以安装 xlsxwriter 库。
Python功能强大,武器库前人已建;你只需要选择最合适的武器;然后阅读说明;你可以在几分钟内练习杰作;当然,这只适合速成班的学生,而你真的想成为编程世界的大师还是需要学习如何打造自己的法宝。
让我们添加另一个链接来比较差异。
我们先来看看Excel的几个概念:
工作簿:每个 Excel 文件都是一个工作簿。
Sheet:每个工作簿可以收录多个工作表,分别对应我们在Excel左下角看到的“sheet1”、“sheet2”等。
单元格:每张表就是我们平时看到的一张表格,可以收录很多行和列,每一个特定的行号和列号对应的网格就是一个单元格。
那我就随便选一个武器:xlsxwriter(这个不能打开和修改已有的excel文件);虽然缺少了一些功能,但是对于我现在的需求来说已经足够了。
对该模块的深入研究,请参考这里:
首先是安装这个模块:pip install xlsxwriter
接下来,尝试编写一个小脚本来创建一个excel文件并在其中写入一些简单的数据。
下面给出一个例子:
#!python3
导入 xlsxwriter
#本例主要实现Excel文件的基本操作
#创建Excel文件
workbook = xlsxwriter.Workbook('testexcel.xlsx')
worksheet = workbook.add_worksheet('TEST')
workbook.close()
#读取现有EXCEL文件功能xlsxwriter模块没有这个功能,所以这里创建的文件和上面的不一样
workbook = xlsxwriter.Workbook('testexcel.xlsx')
worksheet = workbook.add_worksheet('TEST')
#设置列宽
worksheet.set_column('A:A',40)
worksheet.set_row(0, 40)
#自定义格式
粗体 = workbook.add_format({'bold':True})
a = workbook.add_format({'font_size': 26,'bold': True,'align':'left','bg_color':'cccccc'})
b = workbook.add_format({'border': 1,'font_size': 13,'bold': True,'align':'center','bg_color':'ccccc0'})
worksheet.write('C1', "python excel")
worksheet.strings_to_urls
worksheet.write_row('H1',['X','X','X'],b)
worksheet.write_row('H2',['X','X','X'],b)
worksheet.write_row('H3',['X','X','X'],b)
worksheet.write_row('H4',['X','X','X'],b)
worksheet.write_row('H5',['X','X','X'],b)
worksheet.write_row('H6',['X','X','X'],b)
#A1Cell写入数据
worksheet.write('A1','你好')
#B1Cell 写入数据并加粗
worksheet.write('B1','World',bold)
#A2Cell 写入数据并加粗
worksheet.write('A2','欢迎使用 Python!', 粗体)
#另一种写数据的形式
worksheet.write(2,0,20)
worksheet.write(3,0,111.205)
#写公式
worksheet.write(4,0,'=SUM(A3:A4)')
#插入图片
worksheet.insert_image('A10', '11_test001.jpg')
worksheet.insert_image('A10', '11_test001.jpg', {'url':''})
workbook.close()
有了上面的基础知识,我们就可以继续实现我们的想法了。
第六步:将抓取到的数据写入EXCEL文件,做一个简单的图表分析
以上是题外话,下面进入正题;我们将在程序中添加代码,以达到将抓取到的数据写入EXCEL文件的目的,文件命名方式为主题+日期。
在真实环境中,我们不仅仅是爬取数据来获取;关键是从数据中过滤和分析有用的信息。
只需上传代码:
#!python3
导入请求,bs4,xlsxwriter,时间
#环境运营基础数据定义
#**************************************************** ************************
scriptRuningTime = time.strftime("%Y%m%d_%H%M%S", time.localtime())
outFileName ='LotteryHistoryDataList_' + scriptRuningTime +'.xlsx'
baseWebAddress = ""
#函数定义
#**************************************************** ************************
def GetWinningInfo(网址):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,'html.parser')
resultinfo_qishu = htmlinfo.select('td')
resultinfo_haoma = htmlinfo.select('em')
#包括每期的期数;抽奖日期和其他信息
resultinfo_haomalist = str(resultinfo_haoma).replace('','').replace('','').replace('','').replace('[','').replace(')', '')。分裂(',')
#print(len(resultinfo_qishu))
发行者数据 = []
对于范围内的 i(0,len(resultinfo_qishu)-1,7):
发行人数据 = []
对于范围内的 j(0,2):
如果 j == 0:
#print('绘图日期:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
a = str(resultinfo_qishu[i+j]).replace('
','')。代替('
','')
issuerData.append(a)
别的:
#print('问题编号:' + str(resultinfo_qishu[i+j]).replace('
','')。代替('
',''))
b = str(resultinfo_qishu[i+j]).replace('
','')。代替('
','')
issuerData.append(b)
x = []
对于范围内的 n(0,7):
x.append(resultinfo_haomalist[i+n])
#print('红球: %s,%s,%s,%s,%s,%s; 蓝球: %s'% (x[0],x[1],x[2],x [ 3],x[4],x[5],x[6]))
issuerData.append(x)
issuerDatas.append(issuerData)
返回 issuerDatas
#主要的
#**************************************************** ************************
#TODO:获取总页数
numberOfPages = 113 #有兴趣的可以尝试从网站获取这个号码。
#创建一个Excel文件并写入标题
工作簿 = xlsxwriter.Workbook(outFileName)
worksheet = workbook.add_worksheet('彩票')
worksheet.hide_gridlines(2)
tableHeader = ["NO.","Draw Date","Date Number","Red Ball 1","Red Ball 2","Red Ball 3","Red Ball 4","Red Ball 5","Red球 6","蓝色球 1",]
a = workbook.add_format({'border': 1,'font_size': 20,'bold': True,'align':'center','bg_color':'ccccc0'})
b = workbook.add_format({'border': 1,'font_size': 13,'align':'left','bg_color':'5F9EA0'})
c = workbook.add_format({'border': 1,'font_size': 13,'align':'left','bg_color':'D2B48C'})
worksheet.write_row('A1', tableHeader,a)
#开始一一爬取数据
我 = 0
对于范围内的 e(1,numberOfPages+1):
print('--------这是页面 %s--------'% e)
realWebAddress = baseWebAddress +'/list_'+ str(e) +'.html'
resultall = GetWinningInfo(realWebAddress)
对于结果中的每个IssuerData:
我 = 我 + 1
cellPos1 ='A' + str(i+1)
cellPos2 ='B' + str(i+1)
#小细节在写入前将捕获的数据转换为数字格式
cellValue = [everyIssuerData[0],int(everyIssuerData[1]),int(everyIssuerData[2][0]),int(everyIssuerData[2][1]),int(everyIssuerData[2][2]),int (everyIssuerData[2][3]),int(everyIssuerData[2][4]),int(everyIssuerData[2][5]),int(everyIssuerData[2][6])]
如果 (i% 2) == 0:
worksheet.write(cellPos1,i,b)
worksheet.write_row(cellPos2, cellValue,b)
别的:
worksheet.write(cellPos1,i,c)
worksheet.write_row(cellPos2, cellValue,c)
#添加工作表
chartSheet = workbook.add_worksheet('图表')
#添加折线图图表对象
chart_col = workbook.add_chart({'type':'line'})
name ='=%s!$J$1'%'彩票'
类别 ='=%s!$B$2:$B$%s'% ('彩票',(i + 1))
values='=%s!$J$2:$J$%s'%('彩票',(i + 1))
打印('%s|%s|%s'%(名称、类别、值))
chart_col.add_series({
# 这里sheet1是默认值,因为我们新建sheet的时候没有指定sheet名称
# 如果我们在新建sheet的时候设置了sheet名称,这里必须设置为对应的值
'名称':名称,
“类别”:类别,
“价值观”:价值观,
'线':{'颜色':'蓝色'},
})
chart_col.set_title({'name':'蓝球分析'})
chart_col.set_x_axis({'name':'Draw Date'})
chart_col.set_y_axis({'name':'BlueNumber'})
chart_col.set_style(1)
chartSheet.insert_chart('B2', chart_col)
chart_col.set_size({'width': 10000,'height': 500})
workbook.close()
运行上述代码的结果是:
好了,到此我的目的基本实现了。以后可能会尝试用一些“ship away”算法来实现一些数据分析,看看有没有时间。
如果你喜欢这篇文章,请给我一个赞。本文如有遗漏,欢迎大家赐教,共同进步~
文档和源代码附件在: