【HSP】2017年版 F1ランキングページを生成してみる【その1】

Formula 1 site

2017年も2月になり、そろそろニューマシンが発表になったりする季節になってきました。いかがお過ごしでしょうか? 昨年はロズベルグがチャンピオンを獲得し、そして電撃的な引退発表。今シーズンは前年王者なきチャンピオンシップ、一体どんなレースが展開されていくのでしょうか。

…前置きはこれぐらいにしておいて、今年もランキングページの生成をやっていきたいと思います。まずは昨年作成したプログラムを今年用に対応させていきましょう。

スポンサーリンク

公式サイトでurlのチェック

Formula 1

おなじみの公式サイトです。2017年シーズンのドライバーリザルトのページurlは

https://www.formula1.com/en/results.html/2017/drivers.html

去年と比較してみると、西暦の数字部分以外は変化なしのようです。なので、プログラムもその部分を修正すれば大丈夫そう。

レーススケジュールをチェック

次に公式サイトから、今度は今シーズンのレーススケジュールを確認します。今年はドイツグランプリが無くなっています。ニュルブルクリンクでの開催だったと思うのですが(たしかホッケンハイムとの交互開催)残念ですね。

F1 2017 カレンダー

さて、開幕戦は3月26日のオーストラリアグランプリ。そこから全20戦で争われる予定になってます。これをテキストにおこしておきます(これを利用して、グランプリ終了ごとにドライバーランキングのhtmlを生成します)。また、何年度のスケジュールなのかを区別するために、テキストのファイル名を「2017f1calendar.txt」としました。テキストの内容は以下の通り。

3/26,AUSTRALIAN GRAND PRIX
4/9,CHINESE GRAND PRIX
4/16,BAHRAIN GRAND PRIX
4/30,RUSSIAN GRAND PRIX
5/14,SPAIN GRAND PRIX
5/28,MONACO GRAND PRIX
6/11,CANADA GRAND PRIX
6/21,AZERBAIJAN GARND PRIX
7/9,AUSTRIA GRAND PRIX
7/16,BRITISH GRAND PRIX
7/30,HUNGARY GRAND PRIX
8/27,BELGIAN GRAND PRIX
9/3,ITALIA GRAND PRIX
9/17,SINGAPORE GRAND PRIX
10/1,MALAYSIA GRAND PRIX
10/8,JAPANESE GRAND PRIX
10/22,USA GRAND PRIX
10/29,MEXICO GRAND PRIX
11/12,BRASIL GRAND PRIX
11/26,ABU DHABI GRAND PRIX

そして、テキスト名を変えたので、プログラムで対応する部分も書き換えておきます。

これで、昨年つくったプログラムを今年用に対応できました。

今後の展開

今年は、レースごとのリザルトの取得やページの生成をしていく予定です。うまく進められれば、コンストラクターズやポイントのグラフ化なんかできたら面白いですね。さらにはHSPでsqliteを使うことができるので、データベースへの挑戦まで手が付けられるとPHPでの取り扱いも視野に入れられます。どこまで出来るかわかりませんが、興味のある方はお付き合いいただければ幸いです。

まとめ&コード

…しまった! 「今後の展開」でまとめを書いてしまったw というわけで、地上波での放送とかないので盛り上がりはそれほどなく開幕しそうですが、ホンダの動向はもちろん、メルセデスやフェラーリ・レッドブル・ウィリアムズなど白熱のレースが繰り広げられることを願っています。では、最後に今回のコードです! 参考になれば。

//HSPモジュール SAKMISさんのを使用しています
//命令→lfcc ファイルネーム
//読み込み→改行置換→保存
    #module
    #deffunc lfcc str filename
;   mref filename,32
;   mref status,64
        exist filename
        size=strsize
        if size=-1 : status=-1 : return
        sdim ss,size+1,1
        bload filename,ss,size

        ii=0
        code=0
        sdim data,size<<1,1

    repeat size
        tt = peek (ss,cnt)
        if tt=10 : code=10 : break
        if tt=13 {
        code=13
        tt = peek (ss,cnt+1)
        if tt=10 : code=0
        break
        }
    loop

        if code=0 : status=-1 : return

    repeat size
        tt = peek (ss,cnt)
        if tt=code : wpoke data,ii,2573 : ii+2 : continue
        poke data,ii,tt : ii++
    loop

        bsave filename,data,ii
        status=ii
    return
#global

    #include "hspinet.as"

    // ネット接続の確認
    netinit
    if stat : dialog "ネット接続できません" : end

    // 初期設定
    download_url = "https://www.formula1.com/en/results.html/2017/drivers.html"
    sdim firstname,  40, 40
    sdim familyname, 40, 40
    sdim country,    40, 40
    sdim teamname,   40, 40
    sdim getpoint,   40, 40

    // f1カレンダーチェック(第6回作成部分)
    month = gettime(1)
    day = gettime(3) + month * 40
    racename = ""
    notesel a
    noteload "2017f1calendar.txt"
    repeat notemax
        noteget text_line, cnt
        split text_line, ",", result
        split result(0), "/", chk_mm, chk_dd
        chkday = int(chk_dd) + int(chk_mm) * 40
        if day > chkday {
            racename = result(1)
        } else {
            break
        }
    loop


    /* 第一回で作成したダウンロード部分 */

    // URL分解
    if (instr(download_url, 0, ".html") ! -1) or (instr(download_url, 0, ".php") ! -1) { //.html .phpが含まれているなら
        split download_url, "/", result
        url_pagename = result(stat-1)
        url_address  = download_url
        strrep url_address, url_pagename, ""
    } else { // 含まれていない場合はindex.htmlにする
        url_address  = download_url
        url_pagename = "index.html"
    }

    neturl url_address
    netrequest url_pagename

    *main
    //取得待ち確認
    netexec res
    if res > 0 : goto *comp
    if res < 0 : goto *bad
    await 50
    goto *main

    *bad
    //エラー
    neterror estr
    mes "ERROR "+estr
    stop

    *comp
    mes "DOWNLOAD 完了"
    //stop



    /*html生成部分(2~5回で作成)*/

    lfcc "drivers.html"
    notesel htmlfile
    noteload "drivers.html"
    first_cnt = 0 : family_cnt = 0 : country_cnt = 0 : teamname_cnt = 0
    repeat notemax
        noteget text_line, cnt
        // ファーストネーム
        if (instr(text_line, 0, "hide-for-tablet") ! -1) {
            strrep text_line, "<span class=\"hide-for-tablet\">", ""
            strrep text_line, "</span>", ""
            strrep text_line, " ", ""
            //split text_line, ">", buf
            //split buf(1), "<", result
            //text_line = result(0)
            firstname(first_cnt) = text_line
            first_cnt++
            continue
        }
        // ファミリーネーム
        if (instr(text_line, 0, "hide-for-mobile") ! -1) {
            strrep text_line, "<span class=\"hide-for-mobile\">", ""
            strrep text_line, "</span>", ""
            strrep text_line, " ", ""
            familyname(family_cnt) = text_line
            family_cnt++
            continue
        }
        // 国籍
        if (instr(text_line, 0, "dark semi-bold uppercase") ! -1) {
            strrep text_line, "<td class=\"dark semi-bold uppercase\">", ""
            strrep text_line, "</td>", ""
            strrep text_line, " ", ""
            country(country_cnt) = text_line
            country_cnt++
            continue
        }

        // 所属チーム
        if (instr(text_line, 0, "grey semi-bold uppercase ArchiveLink") ! -1) {
            split text_line, ">", buf
            split buf(1), "<", result
            teamname(teamname_cnt) = result(0)
            teamname_cnt++
            continue
        }

        // 獲得ポイント
        if (instr(text_line, 0, "dark bold") ! -1) and (instr(text_line, 0, "</td>") ! -1) {
            strrep text_line, "<td class=\"dark bold\">", ""
            strrep text_line, "</td>", ""
            strrep text_line, " ", ""
            getpoint(point_cnt) = text_line
            point_cnt++
            continue
        }

    loop
    noteunsel

    //make_html
    html_text = "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"content-language\" content=\"ja\">\n<title>2016ドライバーランキング</title>\n<style>\nbody {\ncounter-reset: drivername;\n}\nli {\ndisplay: flex;\n}\ndiv {\nmargin-right: 1rem;\n}\n.drivername, .team {\nwidth: 12rem;\n}\n.country {\nwidth: 6rem;\n}\n.drivername:before {\ncounter-increment:drivername;\ncontent:counter(drivername) \"位 \";\ndisplay: inline-flex;\nwidth: 3rem;\n}\n</style>\n</head>\n<body>\n<h1>2016ドライバーランキング</h1>\n<ul>"
    repeat 40
        if firstname(cnt) = "" : break
        html_text += "<li>\n<div class=\"drivername\">" + firstname(cnt) + " " + familyname(cnt) + "</div>\n<div class=\"country\">" + country(cnt) + "</div>\n<div class=\"team\">" + teamname(cnt) + "</div>\n<div class=\"point\">" + getpoint(cnt) + "</div>\n</li>\n"
    loop
    //html_text += "</ul>\n</body>\n</html>\n"
    html_text += "</ul>\n<p>※" + racename + " 終了時点のランキングです</p></body>\n</html>\n"


    nkfcnv html_text,html_text,"Sw"

    notesel html_text
    //notesave "driverspoint.html"
    notesave racename+"_finished.html"
    noteunsel
    await 1
    dialog "save html file"
    //mesbox html_text, 640, 400

    end
    stop
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする