数量可视化(五)基于网络爬虫制作可视化图表法律

发布时间:2018-12-14  栏目:法律  评论:0 Comments

  • 据悉网络爬虫的可视化图表:golang,goquery
  • 案例:近年来十年全国彩票销售变情形
  • 案例:中国科大学院士分布
  • 数据可视化技术方案:基于 SVG (D3、拉菲尔(Raphael)(Raphael))、基于 Canvas(Echarts)

本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html

咱身处好数据时,几乎以拥有工作如商业技术、金融、科研教育等行业,以及日常生活中还或用涉及数额解析活动。横一向拘禁数据解析的知系统贯穿数据拿到、数据存储、数据解析、数据挖掘、数据可视化等各国大部分;按数据来源分,即好是温馨征集的数量,也堪买入多少要因公开数据集。

大家于Asp.net
mvc的view开发过程中,假若无留神或碰面刻画大量底复的代码。这首随笔介绍3种植办法重构View的代码,来压缩View中的重新代码。

依据公开数量举办剖析的口舌,必须提到的饶是网爬虫(web
crawler),也让称网络蜘蛛(spider)、自动索引程序(automatic
indexer),搜索引擎(Google,百度等)就是民众通常生活中接触到的绝杰出、最强大的爬虫。

   1、母板页

公然数据包括政党(总结局、央行、银监会、证监会等)、集团、社会公司与互联网及的村办发表音信分外。在层层的互联网内容中,有价音讯似乎‘待字闺中’深藏的红粉,等待有心人去打。例如:

    在Asp.net
mvc中保留了母板页的使用,我们得以运用母板页对我们的站点举行布局。看下母板页的代码:

  • 案例:如今十年全国彩票销售变意况
  • 案例:中国科高校院士分布(出生地和籍贯)
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link href="http://www.cnblogs.com/Content/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="page">
        <div id="header">
            <div id="title">
                <h1>My MVC Application</h1>
            </div>
            <div id="logindisplay">
                <%= Html.Action("LogOnWidget", "Account") %>
            </div> 
            <div id="menucontainer">
                <ul id="menu">              
                    <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
                    <li><%= Html.ActionLink("Profiles", "Index", "Profile")%></li>
                    <li><%= Html.ActionLink("About", "About", "Home")%></li>
                </ul>
            </div>
        </div>
        <div id="main">
            <asp:ContentPlaceHolder ID="MainContent" runat="server" />
            <div id="footer"></div>
        </div>
    </div>
</body>
</html>

中科院院士分布意况|201801

 

全国彩票销售意况

    在Asp.net mvc中使用母板页和Web
Form中接近,需要定义ContentPlaceHolder,加上选择有常用的HTML标签举行布局。
当四只页面都生同一的情的当儿,使用母板页是那些有效之。

以贯彻上述图表,相关技术方案的要如下:

2、Partial

  • 开发语言:
    基于
    Golang
    实现爬虫基本功用,首要考虑 Go
    语言

    自身对于网络方面的有力支撑,语言级 Goroutines 提供并发高性能协助。
  • HTML选择器: goquery jQuery-style HTML manipulation in Go
  • 数存储:
    csv,PostgreSQL
  • 多少可视化:ECharts

    Partial类似于Web
Form中之用户控件。用它来渲染成内容页,使用Partial最要命之便宜是这么些代码段定义在View页面,而不是代码中。下边举例表明:

因网络爬虫制作可视化图表

   
渲染partial卓殊简单,大家可以在父View中应用RenderPartial和Partial方法,Profiles的代码如下,在Profiles中利用RenderPartial渲染Profile。

案例

数据出自页面:

数来源-专题

数码来源于-内容

多少来自-翻页

数据来源页面-源代码

数来页面-源代码

//caipiao_task.go

func Handle_GMOF_CaiPiao_Month_BatchTask() {
    data := read_csv_caipiao("./data/caipiao_list.csv", ",")
    if data != nil {
        for i := range data {
            go Handle_GMOF_CaiPiao_Month_Task(url)
        }
        <-time.After(60 * time.Second)
    }
}

func Handle_GMOF_CaiPiao_Month_Task(url string) {
    if url != "" {
        myspider := init_GMOF_CaiPiao_Month_HTMLSpider(url)
        ctx, _ := myspider.Setup(nil)
        myspider.Spin(ctx)
    }
}

//caipiao_spider.go
package main

import (
    "log"
    "regexp"
    "strings"

    "github.com/PuerkitoBio/goquery"
    "github.com/celrenheit/spider"
)

type GMOF_CaiPiao_Month_HTMLSpider struct {
    title string `json:"title"`
    url   string `json:"url"`
    desc  string `json:"desc"`
}

func init_GMOF_CaiPiao_Month_HTMLSpider(url string) *GMOF_CaiPiao_Month_HTMLSpider {
    spider := NewGMOF_CaiPiao_Month_HTMLSpider()
    spider.url = url
    return spider
}

func (w *GMOF_CaiPiao_Month_HTMLSpider) Setup(ctx *spider.Context) (*spider.Context, error) {
    return spider.NewHTTPContext("GET", w.url, nil)
}

func (w *GMOF_CaiPiao_Month_HTMLSpider) Spin(ctx *spider.Context) error {
    if _, err := ctx.DoRequest(); err != nil {
        return err
    }

    html, err := ctx.HTMLParser()
    if err != nil {
        return err
    }

    caipiao := NewGMOF_CaiPiao_Month()

    //<title></title>
    caipiao.Title = html.Find("title").Eq(0).Text()
    caipiao.Title = Convert2String(caipiao.Title, GB18030)
    //class="TRS_Editor"
    html.Find(".TRS_Editor").Each(func(i int, s *goquery.Selection) {
        content := s.Find("p").Text()
        caipiao.Content = content

        if content != "" {
            content = Convert2String(content, GB18030)
            rows := strings.Split(content, "。")

            for _, value := range rows {
                //fmt.Printf("======arr[%d]=\n [%s] \n", index, value)
                if strings.Index(value, "全国彩票") > 0 {
                    reg := regexp.MustCompile(`全国共销售彩票([\d]+.[\d]+)\S+`)
                    result := reg.FindStringSubmatch(value)
                    if len(result) > 0 {
                        caipiao.Total = result[1]
                    }
                }
            }
        }
    })

    //id="appendix"
    html.Find("#appendix").Each(func(i int, s *goquery.Selection) {
        href, _ := s.Find("a").Eq(0).Attr("href") //附件
        caipiao.Attachid = href
    })

    //===== export data
    save_csv("./data/caipiao_result.csv", caipiao)
    return err
}

前年2月份全国彩票销售情形,385.55
前年1月份全国彩票销售场馆,376.53
二〇一七年十二月份全国彩票销售意况,369.28
前年12月份全国彩票销售情形,350.67
二零一七年五月份全国彩票销售场合,337.55
二〇一七年8月份全国彩票销售情状,338.42

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Profile>>" %>
<h2>Profiles</h2>
<table>
    <tr>
        <th>Username</th>
        <th>First name</th>
        <th>Last name</th>
        <th>Email</th>
    </tr>
    <% foreach (var profile in Model) { %>
        <% Html.RenderPartial("Profile", profile); %>
    <% } %>
</table>

可视化图表:以 ECharts 为条例

大的图表库,本文案例用 ECharts 作为图表组件

  • HighCharts:JavaScript
    编写,开源许可证允许个人用户和非商业用途。
  • Baidu
    ECharts
    :底层画图基于
    Canvas, BSD 许可证协议。
  • Kartograph:构建交互式地图轻量级类库。

//http://echarts.baidu.com/demo.html#line-gradient
data = [["2017年11月",385.55],["2017年10月",376.53],["2017年9月",369.28],["2017年8月",350.67],["2017年7月",337.55],["2017年6月",338.42],["2017年11月",385.55],["2017年10月",376.53],["2017年9月",369.28],["2017年8月",350.67],["2017年7月",337.55],["2017年6月",338.42],["2017年11月",385.55],["2017年10月",376.53],["2017年9月",369.28],["2017年8月",350.67],["2017年7月",337.55],["2017年6月",338.42],["2017年5月",376.95],["2017年4月",382.45],["2017年3月",379.33],["2017年2月",0],["2017年1月",291.61],["2016年12月",365.94],["2016年11月",344.82],["2016年10月",338.27],["2016年9月",320.71],["2016年8月",310.12],["2016年7月",324.03],["2016年6月",339.61],["2016年5月",346.19],["2016年4月",348.89],["2016年3月",356.88],["2016年2月",224.54],["2016年1月",326.41],["2015年12月",341.21],["2015年11月",306.30],["2015年10月",312.34],["2015年9月",290.78],["2015年8月",280.96],["2015年7月",270.47],["2015年6月",281.2371],["2015年5月",321.07],["2015年5月",321.07],["2015年4月",326.12],["2015年3月",308.12],["2015年2月",247.90],["2015年1月",392.33],["2014年12月",361.53],["2014年11月",341.18],["2014年10月",327.01],["2014年9月",322.52],["2014年8月",315.36],["2014年7月",372.09],["2014年6月",360.54],["2014年5月",307.94],["2014年4月",315.29],["2014年3月",328.74],["2014年2月",200.1],["2014年1月",271.49],["2013年12月",302.73],["2013年11月",274.16],["2013年10月",271.83],["2013年9月",257.62],["2013年8月",246.18],["2013年7月",243.65],["2013年6月",247.46],["2013年5月",273.41],["2013年4月",285.61],["2013年3月",273.37],["2013年2月",168.65],["2013年1月",248.59],["2012年12月",268.01],["2012年11月",237.06],["2012年10月",215.38],["2012年9月",205.12],["2012年8月",197.12],["2012年7月",201.98],["2012年6月",216.14],["2012年5月",236.16],["2012年4月",235.76],["2012年3月",235.79],["2012年2月",202.17],["2012年1月",164.54],["2011年12月",224.80],["2011年11月",210.08],["2011年10月",203.28],["2011年9月",196.44],["2011年8月",187.72],["2011年7月",182.05],["2011年6月",174.53],["2011年5月",187.28],["2011年3月",190.12],["2011年2月",112.92],["2011年1月",160.09],["2010年12月",171.89],["2010年11月",160.24],["2010年10月",149.95],["2010年9月",139.56],["2011年4月",186.50],["2010年8月",135.75],["2010年7月",132.74],["2010年6月",140.71],["2010年5月",144.38],["2010年4月",141.05],["2010年3月",132.52],["2010年2月",86.71],["2010年1月",126.99],["2009年12月",133.30],["2009年11月",117.05],["2009年10月",116.47],["2009年9月",111.73],["2009年8月",110.64],["2009年7月",107.87],["2009年6月",113.51],["2009年5月",121.59],["2009年4月",114.61],["2009年3月",114.49],["2009年2月",89.21],["2009年1月",74.33],["2008年12月",102.07],["2008年11月",94.09],["2008年10月",79.88],["2008年8月",84.66]];
var dateList = data.map(function (item) {
    return item[0];
});
var valueList = data.map(function (item) {
    return item[1];
});

option = {
    // Make gradient line here
    visualMap: [{
        show: false,
        type: 'continuous',
        seriesIndex: 0,
        min: 0,
        max: 400
    }, {
        show: false,
        type: 'continuous',
        seriesIndex: 1,
        dimension: 0,
        min: 0,
        max: dateList.length - 1
    }],
    title: [{
        left: 'center',
        text: 'Gradient along the y axis'
    }, {
        top: '55%',
        left: 'center',
        text: 'Gradient along the x axis'
    }],
    tooltip: {
        trigger: 'axis'
    },
    xAxis: [{
        data: dateList
    }, {
        data: dateList,
        gridIndex: 1
    }],
    yAxis: [{
        splitLine: {show: false}
    }, {
        splitLine: {show: false},
        gridIndex: 1
    }],
    grid: [{
        bottom: '60%'
    }, {
        top: '60%'
    }],
    series: [{
        type: 'line',
        showSymbol: false,
        data: valueList
    }, {
        type: 'line',
        showSymbol: false,
        data: valueList,
        xAxisIndex: 1,
        yAxisIndex: 1
    }]
};

 

极品实践

  • 默认调色板(palette)
    [图表及传失利…(image-835cce-1515641952307)]

Navy    — #001f3f
Blue    — #0074d9
Aqua    — #7fdbff
Teal    — #39cccc
Olive   — #3d9970
Green   — #2ecc40
Lime    — #01ff70
Yellow  — #ffdc00
Orange  — #ff851b
Red     — #ff4136
Maroon  — #85144b
Fuchsia — #f012be
Purple  — #b10dc9
Black   — #111111
Gray    — #aaaaaa
Silver  — #dddddd
White   — #ffffff
  • 优化图表JS生成模板
    图表定型后,可以透过沙盘固化配置,按照需要动态变化目的文件(html,js,svg等等),详见
    马克down 的 HTML
    网页模板

  • 优化采集器 Goroutines “线程池”
    例如:PostgreSQL Exception: Open too many files

  • 优化数据存储
    例如:常用的 GIS 坐标库

  
上边的代码,我以一个profile的List渲染成一个table。每一行定义了一个Partial,用来渲染成一行。固然内容页不可知跟另外View分享,在一个View中采取partial可以简化和压缩HTML的签数量。RenderPartial方法要一个partial名字与一个Model参数。按照的partial名字用来查找本地的partial文件,需听从下面的条条框框:

扩展阅读:开源工具及案例

    1 <Area>\<Controller>\<PartialName>.aspx and
.ascx 
    2 <Area>\Shared\<PartialName>.aspx and .ascx 
    3 \<Controller>\<PartialName>.aspx and .ascx 
    4 \Shared\<PartialName>.aspx and .ascx

golang-based library

    那些招来类似于遵照view的name搜索view,也得接纳<%=
Html.Partial(“Profile”, profile) %>
渲染。Profile文件就好是一个ASCX文件,借使必要吗可以是一个aspx的公文。Profile的代码如下:

可视化图表案例

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Profile>" %>
<tr>
    <td>
        <%= Html.ActionLink(Model.Username, "Show", new{ username = Model.Username }) %>
    </td>
    <td><%= Model.FirstName%></td>
    <td><%= Model.LastName%></td>
    <td><%= Model.Email %></td>
</tr>

可视化图表技术方案

  • 基于 SVG : D3、Raphael

  • 法律,基于 Canvas : Echarts

  • HighCharts
    海外开源产品,JavaScript
    编写,自带主旨、动态交互方便,近期庄新版业务视图、地图应用、交互式流量图等是基于此库房实现。
    不足:紧缺粤语文档,开源许可证就同意个人用户和非商业用途,规模应用存在法律风险。

  • Baidu
    ECharts

    极早来百度各个事情体系报表需求,底层画图基于 Canvas
    。二〇一三年开源,完全免费的BSD协议。
    特色:拖拽重算,第三在正式格式辅助,中文社区支撑
    实例:http://echarts.baidu.com/doc/example.html
    Github:
    https://github.com/ecomfe/echarts

  • Kartograph
    Kartograph
    是单构建交互式地图的简单、轻量级类库。它含六只仓库,一个为此Python写的,用于发生特出和裁减的SVG地图,另一个凡js类库用于前端体现地图用。

  • lchart(go-based)

我们以View中如下渲染Profiles:

推而广之阅读:数据可视化

    <% Html.RenderPartial("Profiles", Model); %>

渲染效果如下:

法律 1

3、Child Action

   
Partial用来展现都是Model的音讯平日那么些便宜之。不过有时View上体现的多寡源自其他Model。例如,登录控件可能会晤显当前用户的称号和电子邮件,但该View的着重点部分及用户关系不大。可以选择ViewDataDictionary来传递没联系的Model,可是我们好运用Child
Action。对于以View中形和核心没有多异常关系之信息,这里介绍一下Child
Action的使用。下面举例子表明。

  
在模板页中体现当前之用户音讯,当用户登录后,突显用户称,邮箱之类的新闻,当用户没有登录,给起登录的连接。在模板页中出席下面代码:

            <div id="logindisplay">
                <%= Html.Action("LogOnWidget", "Account") %>
            </div> 

 

   
LogOnWidget的代码如下,ChildActionOnly确保只好通过RenderAction调用此道。

[ChildActionOnly]
public ViewResult LogOnWidget()
{
    bool isAuthenticated = Request.IsAuthenticated;
    Profile profile = null;

    if (isAuthenticated)
    {
        var username = HttpContext.User.Identity.Name;
        profile = _profileRepository.Find(username);
        if (profile == null)
        {
            profile = new Profile(username);
            _profileRepository.Add(profile);
        }
    }

    return View(new LogOnWidgetModel(isAuthenticated, profile));
}

 

故而一个用户控件来彰显这Action的Model的消息,用户控件代码如下。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Import Namespace="AccountProfile.Controllers"%>
<%
    if (Request.IsAuthenticated) {
%>
        Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
        [ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> | <%= Html.ActionLink("Profile", "Show", "Profile", new RouteValueDictionary(new { username = Html.Encode(Page.User.Identity.Name) }), null)%> ]
<%
    }
    else {
%> 
        [ <%= Html.ActionLink("Log On", "LogOn", "Account") %> ]
<%
    }
%>

 

总结:正文演说了三栽办法来重构你View的代码,使用即时二种情势得以大大方方滑坡View层重复现身的代码。由于也是近日最先学习asp.net
mvc,假使叙述和透亮有题目欢迎批评指正。

参考:Asp.net  mvc2 in action

作者:朱祁林 出处:http://zhuqil.cnblogs.com
本文版权归作者和果壳网共有,欢迎转载,但未经作者同意要保留这一个段子讲明,且当小说页面显著地方被闹原文连接,否则保留追究法律责任的权。

留下评论