请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
08/15
22:52
分享
评论
  • "a855640" order="4001" status="0" gy="欧罗巴,莫斯巴达,图恩" yy="欧罗巴,莫斯科斯巴達,图恩" lid="63" fid="855640" sid="5295"class="" infoid="132788" r="1"> <td align="center" class=""><input type="checkbox" name="check_id[]" value="855640" />周四001td> <td bgcolor="#6F00DD" class="ssbox_01"><a style="color:#fff" target="_blank" href="//liansai.500.com/zuqiu-5295/">欧罗巴a>td> <td align="center">资格赛3td> <td align="center">08-16 00:45td> <td align="center">td> <td align="right" class="p_lr01"><span class="gray">span><a target="_blank" href="//liansai.500.com/team/1114/">莫斯巴达a><span class="sp_rq">(-1)span>td> <td align="center"><div class="pk"><a href="./detail.php?fid=855640&r=1" target="_blank" class="clt1" >a><a href="./detail.php?fid=855640&r=1" target="_blank" class="fgreen" data-ao="半球/一球" data-pb="一球">一球a><a href="./detail.php?fid=855640&r=1" target="_blank" class="clt3" >a>div>td> <td align="left" class="p_lr01"><a target="_blank" href="//liansai.500.com/team/777/">图恩a><span class="gray">span>td> <td align="center" class="red"> - td> <td align="center" class="bf_op"> td> <td align="center" class="red">  <a href="./detail.php?fid=855640" class="live_animate" title="动画" target="_blank">a>td> <td align="center" class="td_warn"><a target="_blank" href="//odds.500.com/fenxi/shuju-855640.shtml">a> <a target="_blank" href="//odds.500.com/fenxi/yazhi-855640.shtml">a> <a target="_blank" href="//odds.500.com/fenxi/ouzhi-855640.shtml">a> <a target="_blank" id="qing_855640" class="red hide" href="//odds.500.com/fenxi/youliao-855640.shtml?channel=pc_score">a>td> <td align="center" class=""><a href="javascript:void(0)" class="icon_notop">置顶a>td> tr>

      上面这一坨对应到网页显示上就是一条比赛信息:


      既然目标如此明确,那么接下来就是如何编写正则表达式了,这里也要说一下,正则表达式没有万能的,都是根据经验反复尝试出来的,但是基本的规则还是要懂的,具体详细规则可以参考这里:https://github.com/yekai1003/tutorial-go/blob/master/regexp.md

      

      使用go语言正则,关键不在于api调用,而在于正则表达式编写

      bsinforeg := regexp.MustCompile("
    .+?))") infos := bsinforeg.FindAllString(body, -1)

      这个正则的含义是找到所有以

    ” 开头,并且以结尾的代码段, (?s.+?))则是一个子匹配规则,“.”代表任意一个字符,“+”代表之前的字符出现1次或多次,“?”则表示非贪婪匹配,“?:s”的作用则是为了支持匹配回车换行,否则这条规则无法找到匹配结果,这样就可以把相应的代码找到了。

     

    ·MustCompile

    MustCompilego语言里对正则表达式进行编译的函数

     

    ·FindAllString

    FindAllString是找到所有匹配的字符串,注意是找到符合条件的字符串,它的返回结果是一个数组

     

      当我们找到这个信息之后,就可以对上述内容逐行获取了。

        regtd := regexp.MustCompile("
    ") data := regtd.FindAllStringSubmatch(info, -1)

      针对一场比赛,我们使用上面的代码,可以匹配每一内的信息,注意这里用的是FindAllStringSubmatch,这个是按照匹配单元查找,也就是除了查找符合条件的,也会按照小括号内的格式进行匹配,然后直接给出对应内容,这样也就直接获取了想要的信息。注意它的返回值是一个二维数组,按照我们的数据情况,在data[0]存放的实际上是“周四001” 这样的数据,别忘了data[0]也是一个数组,那么在数组的data[0][1]位置就是我们的目标内容:周四001,那么data[0][0]存放的是什么呢?它其实就是整条数据。通过这里实例,我们也就明白了,想要其他数据只需继续按照相同套路处理就可以了,这样就可以把一个比赛的信息都获取到。

     

      大家也会注意到,“析”这个标签也是很重要的部分,它是对比赛的一种分析,我们可以得到一些比赛双方球队的信息,这个也是足彩分析中重要的一环,可以看出强弱,对阵胜负情况,联赛排名,主场和客场胜率情况等等,当我们把这些信息也都拿到的话,就可以建立一个足彩的分析模型,根据模型计算出一个胜负的概率。当你的模型够强大,500万就是一个小目标了!

     

      那么问题来了?如何再获取上述的数据呢?其实我们之前都讲过了,无非就是再次模拟浏览器去请求数据,然后使用正则表达式对数据进行分析,这个时候要做的话,就可以开goroutine来并发操作了,所谓爬虫也就是把相关的网页都爬回来,进行分析。


    完整代码可以到github地址查看

    https://github.com/yekai1003/tutorial-go/tree/master/test/500wan



    免费领取Go语言学习视频可扫码加张老师:


    想看往期公开课或者更深入学习,请前往柏链项目学院:



    柏链开学新优惠:





    本期我们我们讨论的主题仍然是go语言,如何通过go语言实现一个小目标,赚他一个500万呢?很多朋友应该想到了,彩票是可以的,但是彩票的问题就是撞大运,需要有一定的概率知识在里面,否则我们下注的人只能是分母。

     

    作为技术人员,我们追求的始终是确定性,这种靠运气的事情我们不感兴趣。不过让技术和运气相结合,我们倒是可以尝试。彩种方面我们可以选择足彩,足彩的特点是我们可以提前预估一些强弱关系,在确定性方面要比随机的强一些,剩下的事情就交由技术来解决。那么问题来了,需要用到什么技术呢?

     

    首先想到的肯定是网络编程的技术,对于分析足彩数据的事情,肯定要用到爬虫技能,而与爬虫相伴相生的肯定是正则表达式的分析,因为爬虫拿到的数据多是html页面,后面解析里面的内容需要用到正则分析,那为什么要用go语言呢?go语言天生的并发优势,可以让我们在做爬虫时极大的提高效率!

     

    实现爬虫,你需要知道的是首先你是一个浏览器,也就是说你要把自己模拟称一个浏览器,然后向服务器发起请求。显然,此时我们在代码里就是客户端的实现方法。

        client := &http.Client{} //得到客户端对象  req, _ := http.NewRequest("GET", "http://live.500.com/", nil) //构建客户端请求对象  req.Header.Set("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)") //设置请求头,把自己模拟成浏览器  resp, err := client.Do(req) //发起请求  if err != nil {    fmt.Println("Http get err:", err)    return nil  }


    对于请求的响应resp,我们需要先判断是否响应成功,因为服务器有可能拒绝我们。此后将响应数据读出来就算是大功告成了!特别说明:http://live.500.com/ 是一个足彩数据网站。


      //判断是否成功响应    if resp.StatusCode != 200 {    fmt.Println("Http status code:", resp.StatusCode)    return nil  }  defer resp.Body.Close()  //读取全部数据  body, err := ioutil.ReadAll(resp.Body)  if err != nil {    fmt.Println("Read error", err)    return nil  }

    由此可见,拿到网站的数据还是蛮容易的,接下来就考虑解析的问题了。不过需要注意一个小细节,就是编码格式,有些网站采用utf-8的编码格式,这样的比较方便,我们在go语言之中直接使用即可,不过有的网站采用的是gbk的编码方式,我们还需要对得到的数据进行转码,在这里我们使用mahonia进行转码,在import中增加该包,当前之前需要先下载

    go get "github.com/axgle/mahonia"

      这样2行代码,就完成了我们的小目标。

     decoder := mahonia.NewDecoder("GB18030")  utf8_body := decoder.ConvertString(string(body))

      接下来考虑如何解析该网页,这需要大量的分析观察,当然就是用肉眼去看,找到其中的规则,经过分析,我们的目标就是掌握网页中所有下面这样的代码段:

    (.*?)

主题帖 61 关注 0 粉丝 0
情感指数

链路大数据分析置信度 11.16 %

TA的主题帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表