2017年も2月になり、そろそろニューマシンが発表になったりする季節になってきました。いかがお過ごしでしょうか? 昨年はロズベルグがチャンピオンを獲得し、そして電撃的な引退発表。今シーズンは前年王者なきチャンピオンシップ、一体どんなレースが展開されていくのでしょうか。
…前置きはこれぐらいにしておいて、今年もランキングページの生成をやっていきたいと思います。まずは昨年作成したプログラムを今年用に対応させていきましょう。
公式サイトでurlのチェック
おなじみの公式サイトです。2017年シーズンのドライバーリザルトのページurlは
https://www.formula1.com/en/results.html/2017/drivers.html
去年と比較してみると、西暦の数字部分以外は変化なしのようです。なので、プログラムもその部分を修正すれば大丈夫そう。
レーススケジュールをチェック
次に公式サイトから、今度は今シーズンのレーススケジュールを確認します。今年はドイツグランプリが無くなっています。ニュルブルクリンクでの開催だったと思うのですが(たしかホッケンハイムとの交互開催)残念ですね。
さて、開幕戦は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