php抓取开奖网页内容(:利用浏览器的开发者工具分析源码(中英对照))

优采云 发布时间: 2022-01-04 13:12

  php抓取开奖网页内容(:利用浏览器的开发者工具分析源码(中英对照))

  仔细查看 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”算法来实现一些数据分析,看看有没有时间。

  如果你喜欢这篇文章,请给我一个赞。本文如有遗漏,欢迎大家赐教,共同进步~

  文档和源代码附件在:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线