Last active
August 26, 2022 06:07
-
-
Save tatsuyasusukida/f96228a9389603c767feab06f697e23f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
出発地 | 到着地 | 利用カード種別 | 運賃 | マイル | プレミアムポイント | |
---|---|---|---|---|---|---|
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃1 | 691 | 1507 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃2 | 576 | 1322 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃3 | 461 | 1138 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃4 | 461 | 738 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃5 | 345 | 953 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃6 | 345 | 753 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃7 | 345 | 553 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃8 | 230 | 369 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃9 | 691 | 1107 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃10 | 461 | 738 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃11 | 322 | 516 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃12 | 230 | 369 | |
新潟 | 札幌(新千歳) | ANAカード ゴールド | 運賃13 | 137 | 221 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃1 | 312 | 901 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃2 | 260 | 817 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃3 | 208 | 734 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃4 | 208 | 334 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃5 | 156 | 650 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃6 | 156 | 450 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃7 | 156 | 250 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃8 | 103 | 167 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃9 | 312 | 501 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃10 | 208 | 334 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃11 | 145 | 233 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃12 | 103 | 167 | |
新潟 | 東京(成田) | ANAカード ゴールド | 運賃13 | 62 | 100 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃1 | 466 | 1147 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃2 | 388 | 1022 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃3 | 311 | 898 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃4 | 311 | 498 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃5 | 232 | 773 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃6 | 232 | 573 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃7 | 232 | 373 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃8 | 155 | 249 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃9 | 466 | 747 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃10 | 311 | 498 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃11 | 217 | 348 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃12 | 155 | 249 | |
新潟 | 名古屋(中部) | ANAカード ゴールド | 運賃13 | 92 | 149 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃1 | 588 | 1342 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃2 | 490 | 1185 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃3 | 392 | 1028 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃4 | 392 | 628 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃5 | 293 | 871 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃6 | 293 | 671 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃7 | 293 | 471 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃8 | 196 | 314 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃9 | 588 | 942 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃10 | 392 | 628 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃11 | 273 | 439 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃12 | 196 | 314 | |
新潟 | 大阪(伊丹) | ANAカード ゴールド | 運賃13 | 117 | 188 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃1 | 588 | 1342 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃2 | 490 | 1185 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃3 | 392 | 1028 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃4 | 392 | 628 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃5 | 293 | 871 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃6 | 293 | 671 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃7 | 293 | 471 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃8 | 196 | 314 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃9 | 588 | 942 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃10 | 392 | 628 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃11 | 273 | 439 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃12 | 196 | 314 | |
新潟 | 大阪(関西国際) | ANAカード ゴールド | 運賃13 | 117 | 188 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃1 | 1072 | 2116 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃2 | 893 | 1830 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃3 | 715 | 1544 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃4 | 715 | 1144 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃5 | 536 | 1258 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃6 | 536 | 1058 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃7 | 536 | 858 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃8 | 357 | 572 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃9 | 1072 | 1716 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃10 | 715 | 1144 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃11 | 500 | 800 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃12 | 357 | 572 | |
新潟 | 福岡 | ANAカード ゴールド | 運賃13 | 213 | 343 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃1 | 1972 | 3556 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃2 | 1643 | 3030 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃3 | 1315 | 2504 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃4 | 1315 | 2104 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃5 | 986 | 1978 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃6 | 986 | 1778 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃7 | 986 | 1578 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃8 | 657 | 1052 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃9 | 1972 | 3156 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃10 | 1315 | 2104 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃11 | 920 | 1472 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃12 | 657 | 1052 | |
新潟 | 沖縄(那覇) | ANAカード ゴールド | 運賃13 | 393 | 631 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fsPromises from 'fs/promises'; | |
import test from "@playwright/test"; | |
import { sources, destinations, cards, fares } from "./input.json"; | |
test('HTMLを取得します', async ({ page }) => { | |
const sleep = 5000 | |
const timeout = sources.length * destinations.length | |
* cards.length * fares.length * sleep * 2 | |
test.setTimeout(timeout) | |
const url = 'https://cam.ana.co.jp/amcmember/SimulationJaResult' | |
// 事前アクセス(初回アクセス時にエラーページが表示されるため) | |
await page.goto(url) | |
fsPromises.mkdir('tmp/fetch', { recursive: true }) | |
for (const source of sources) { | |
for (const destination of destinations) { | |
for (const card of cards) { | |
for (const fare of fares) { | |
// ANAフライトマイル・プレミアムポイントシミュレーションページへアクセス | |
await page.goto(url) | |
// 出発地の選択 | |
await page.locator('#DepApo_ticket').selectOption(source.code) | |
// 到着地の選択 | |
await page.locator('#ArrApo_ticket').selectOption(destination.code) | |
// 利用カード種別の選択 | |
await page.locator('#cardList_kind').selectOption(card.code) | |
// 利用運賃の選択 | |
await page.locator('#fareList_section').selectOption(fare.code) | |
// 次へ(計算する)ボタンをクリック&ページ遷移を待機 | |
await Promise.all([ | |
page.waitForNavigation(), | |
page.locator('.btn_c a').click(), | |
]) | |
const basename = [source.code, destination.code, card.code, fare.code].join('-') | |
fsPromises.writeFile(`tmp/fetch/${basename}.html`, await page.content()) | |
await page.screenshot({ path: `tmp/fetch/${basename}.png` }) | |
// 優しさ | |
await page.waitForTimeout(sleep) | |
} | |
} | |
} | |
} | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"sources": [ | |
{ "name": "新潟", "code": "KIJ" } | |
], | |
"destinations": [ | |
{ "name": "札幌(新千歳)", "code": "CTS" }, | |
{ "name": "東京(成田)", "code": "NRT" }, | |
{ "name": "名古屋(中部)", "code": "NGO" }, | |
{ "name": "大阪(伊丹)", "code": "ITM" }, | |
{ "name": "大阪(関西国際)", "code": "KIX" }, | |
{ "name": "福岡", "code": "FUK" }, | |
{ "name": "沖縄(那覇)", "code": "OKA" } | |
], | |
"cards": [ | |
{ "name": "ANAカード ゴールド", "code": "WID_GLD" } | |
], | |
"fares": [ | |
{ "name": "運賃1", "code": "400_150_1" }, | |
{ "name": "運賃2", "code": "400_125_2" }, | |
{ "name": "運賃3", "code": "400_100_3" }, | |
{ "name": "運賃4", "code": "0_100_4" }, | |
{ "name": "運賃5", "code": "400_75_5" }, | |
{ "name": "運賃6", "code": "200_75_6" }, | |
{ "name": "運賃7", "code": "0_75_7" }, | |
{ "name": "運賃8", "code": "0_50_8" }, | |
{ "name": "運賃9", "code": "0_150_9" }, | |
{ "name": "運賃10", "code": "0_100_10" }, | |
{ "name": "運賃11", "code": "0_70_11" }, | |
{ "name": "運賃12", "code": "0_50_12" }, | |
{ "name": "運賃13", "code": "0_30_13" } | |
] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fsPromises from "fs/promises"; | |
import test from "@playwright/test"; | |
import { sources, destinations, cards, fares } from "./input.json"; | |
test("HTMLを解析します", async ({ page }) => { | |
const items: any[] = [] | |
for (const source of sources) { | |
for (const destination of destinations) { | |
for (const card of cards) { | |
for (const fare of fares) { | |
const basename = [ | |
source.code, | |
destination.code, | |
card.code, | |
fare.code, | |
].join('-') | |
const filename = `html/${basename}.html` | |
const buffer = await fsPromises.readFile(filename) | |
const html = buffer.toString() | |
await page.setContent(html) | |
const マイル = (await page.locator('#result_mile .total strong').innerText()).replace(/,/g, '') | |
const フライトマイル = (await page.locator('#mile_flight strong').innerText()).replace(/,/g, '') | |
const ボーナスマイル = (await page.locator('#mile_bonus strong').innerText()).replace(/,/g, '') | |
const 区間基本マイレージ = (await page.locator('#bonus_cal tr:nth-child(1) td strong').innerText()).replace(/,/g, '') | |
const クラス運賃倍率 = await page.locator('#bonus_cal tr:nth-child(2) td strong').innerText() + '%' | |
const プレミアムステイタス = await page.locator('#bonus_cal tr:nth-child(3) td strong').innerText() + '%' | |
const プレミアムポイント = (await page.locator('#result_point .total strong').innerText()).replace(/,/g, '') | |
const 路線倍率 = await page.locator('#result_point table table tr:nth-child(3) td strong').innerText() + '倍' | |
const 搭乗ポイント = (await page.locator('#result_point table table tr:nth-child(4) td strong').innerText()).replace(/,/g, '') | |
const input = { source, destination, card, fare } | |
const output = { マイル, フライトマイル, ボーナスマイル, 区間基本マイレージ, | |
クラス運賃倍率, プレミアムステイタス, プレミアムポイント, 路線倍率, 搭乗ポイント } | |
items.push({ input, output }) | |
} | |
} | |
} | |
} | |
const text = JSON.stringify({ items }, null, 2) | |
await fsPromises.mkdir('tmp/parse', { recursive: true }) | |
await fsPromises.writeFile('tmp/parse/data.json', text) | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fsPromises from "fs/promises"; | |
import test from "@playwright/test"; | |
import { items } from "../tmp/parse/data.json"; | |
test("CSVファイルを出力します", async ({ page }) => { | |
const lines = ['出発地,到着地,利用カード種別,運賃,マイル,プレミアムポイント'] | |
for (const { input, output } of items) { | |
const cells = [ | |
input.source.name, input.destination.name, input.card.name, | |
input.fare.name, output.マイル, output.プレミアムポイント, | |
] | |
lines.push(cells.join(',')) | |
} | |
await fsPromises.mkdir('tmp/print', { recursive: true }) | |
await fsPromises.writeFile('tmp/print/data.csv', lines.join('\n')) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment