前売りチケットの価格4

さて、また時間があいてしまいましたが、カリフォルニア州でスキーをするために必須となる前売りチケットの価格調査です。 EPICは発売が終了していました。もう買えません。日付を指定して普通に買うしかありません。8日以上前に買うと$30ぐらい割引があるようですね。直前だと$16くらい。当日だと割引なしということなのでしょう。Heavenlyは当日だと$138〜164ぐらいですね。 Tahoe Super 4は順調に値上がりしていますが、Sugar BowlもIKONもあんまり値段変わらないですね。調査を始めたのが遅すぎたのかもしれません。安く買うならもっともっと早く買ってね、ということなのかも。

ちなみにTahoe Super 4の次回値上げは12/22です。

チケット 10/7 10/11 11/22 12/8
EPIC 4day $479 $489 $489 N/A
EPIC 7day $689 $709 $709 N/A
EPIC Tahoe local $589 $609 $609 N/A
EPIC Tahoe value $499 $519 %519 N/A
EPIC $929 $949 $949 N/A
Tahoe Super 4 $369 $369 $389 $409
Sugar Bowl unrestricted $799 $799 $829 $829
Sugar Bowl slightly restriced $589 $589 $619 $619
IKON PASS $999 $1049 $1049 $1049
IKON BASE PASS $699 $749 $749 $749

いよいよスキー場も全面滑走可能になってきました。行かないといかないというプレッシャー。初めての不安。

TOEICの反省

ひさしぶりに受けたTOEICの反省をします。

リスニングの途中で悩んでしまった。絶対にしてはいけない。わからなかったら諦めないといけないのに悩んでしまった。そして3問ぐらい固まったまま過ごしてしまった。悩むのダメ、絶対! しかも正解が分かっているはずの問題も、答えがAなのかBなのかわからなくなってしまった。しっかり正解と思われるものの上にペン先をおいておかないといけない。

リーディングは難易度が上がっていた気がする。相変わらず時間は足りない。穴埋め問題は悩んではいけない。どんどん埋めていくこと。悩むのダメ、絶対!

全般的に難しかった。相変わらずできた感はない。とにかく必死にすばやく回答するだけ。余裕がうまれることはないと思う。まあでも過去最高点でよかった。

iPhoneのバッテリー交換

日本では予約が取りづらい状態が続いたまま安く交換できる時期が終わろうとしているみたいですが、うちの近所ではそんなこともなく。アップルストア以外でもいろんな店が対象になっていて、予約もわりと空いていた。まあでもなんとなくアップルストアの方が信頼できるのかなーと思ってアップルストアで予約。到着したらすごい人だらけ。アップルストアの人の多さってすごいね。自宅に無いiPadで遊ぶために来ているの?そして店の奥側は修理のために来ている人たちっぽい。アップルIDを入力して予約したせいで、登録された名前が漢字になっていてややこしかった。Is this you?ってなる。とにかく人だらけで店内はうるさい。いろいろ説明されて結局は預けて帰るだけ。

持っていけば1時間くらいで仕上がるのかと思っていた。

とゆうわけで翌朝取りに行く。深夜に交換してるってこと?なかなかのブラックですね。

取りに行っても相変わらず店は満員。もうこの店を選ぶのはやめよう。

Akamaiに監視されているインターネット社会

Webサイトの高速化は非常に重要で、GoogleSEO対策にもとにかく高速なレスポンスを、みたいなことが言われている。そこで活躍するのがCDNというサービスで、Akamaiが有名。Wikipediaにも説明があります。

コンテンツデリバリネットワーク - Wikipedia

例えば、あなたが買い物する楽天akamaiによってCDNが提供されています。

$ nslookup www.rakuten.co.jp
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
www.rakuten.co.jp   canonical name = evsan.rakuten.edgekey.net.
evsan.rakuten.edgekey.net   canonical name = e16791.a.akamaiedge.net.
Name:   e16791.a.akamaiedge.net
Address: 23.197.96.227

アクセスが高速化するならいいじゃないか、ということなんですけど、 akamai access denied とかで検索すると、けっこうな人がアクセス制限を受けているみたい。しかも、契約しているそもそもの会社はあまり認識していない様子。セキュリティ機能ありますよ?有効にしませんか? あ、じゃぁお願いします、みたいな感じなのかもしれない。

Akamaiに監視されるインターネット社会を許していいのでしょうか。

ちなみに、Akamaiにアクセス制限をうけるとIPアドレスを変更するしか制限を回避する方法はないみたいで、VPNを使った回避策をいろんなYouTuberがあげてました。が、これは本質的な解決策ではないですね。Akamaiとの契約を見直すべきだと思いますよ。安易に導入した謎のセキュリティ機能でお客様のアクセスを遮断していませんか?

Akamaiの何が問題か?

Akamaiはかなりの企業が導入をしています。オムロン株式会社、楽天市場プレイステーションネットワークヒルトンホテル、アメックス、ANAなどなど。日本だけではなく海外の企業もたくさんです。EPICPASSも使っています。各社、どのような設定でAkamaiを使っているかは不明ですが、IPアドレスの評価はすべてのAkamaiサイトに共通で評価され、その評価が全体に採用されます。

別に、楽天市場に対してスクレイピングしなくても、EPICPASSにスクレイピングした結果、EPICPASSにはアクセスできなくならないのに楽天市場にはアクセスできなくなるんです。これが、各社どのような設定をしているのか不明なところです。

Access Denied とか Reference # 謎の数値 とかに遭遇したら、Akamaiに遮断されています。

サポートチャットの担当が外国人

ちょっと困ったことがあってサポートサイトを見たら、チャットが用意されていた。よし、問い合わせようと思って開始してみたら、担当してくれたのが中国でトップ3に入るであろう名字の人だった。最近コンビニは全員外国人バイトなんじゃないかと思っていたけど、こういうところまで外国人が入ってきているんだね。なかなか流暢な日本ではあったんだけど、こんな感じでもあった。

A: 恐れ入りますが、他のネット環境でサインインをお試しお願いいたします。

お試しお願い、ですね。はい、すでに試してますよ。

Q: Emailでご連絡いただけるということでしょうか? A: はい、さようでございます。

おぉ、そんな日本語が出てくるとは。

Q: ありがとうございました。 A: とんでもないでございます。 A: 何か不明なことがありましたら、またお問い合わせますようにお願いいたします。

おぉ、そんな日本語が出てくるとはPart 2、と思ったら、お問い合わせますように、ときましたか。しかし、解決できそうな情報へのアクセス権もなさそうだったし、想定しているサポートって、ログインページはどこですか?みたいな単純な質問なんでしょうかね。時給いくらなんだろう。

seleniumでウェブスクレイピング

ウェブスクレイピングとは、Webサイトから欲しい情報を取り出すことです。

  • 注意事項
  • 必要なソフトウェアたち
  • 日経からドル円を取り出す
    • 実際にChromeをたちあげたく無い場合はheadlessモード
  • epic passの価格を取り出す
    • 時間を指定して適当に待つ
    • WebDriverWaitで待つ
  • 正規表現で欲しい部分だけ取り出す

注意事項

Webサイトによってはロボットによる巡回、つまりスクレイピングを禁止している場合があります。まずは /robots.txt を参照してスクレイピングが禁止されていないことを確認しましょう。

たとえば日本経済新聞のサイト https://www.nikkei.com/robots.txt ではこのような指定があります。

User-agent: *
Disallow: /search/site/

ということで、/search/site/ 以下をウェブスクレイピングしないようにしましょう。

(2018/11/28追記) スクレイピングAkamaiに低評価をつけられる可能性があります。 こちらにも書きましたが、何をしたらどれくらい低評価をつけるのかは教えてくれません。複数サイトに対してスクレイピングをするのは問題ありです。今回のスクレイピングで5日間ペナルティくらいました。 スクレイピングする前に、nslookupしてakamaiの場合はスクレイピングしない方が安全です。

tomo3i.hatenablog.com

必要なソフトウェアたち

OSX 10.14上で python3, selenium, chromedriver を想定しています。

python3は標準では入っていないので、Homebrewでインストールしましょう。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

表示に従ってHomebrewをインストールしたら

brew install python3
brew cask install chromedriver
pip3 install selenium

日経からドル円を取り出す

日経のサイトは一番上にドル円が買いてあります。1ドル=112.96-97円というやつ。この部分をどうやって指定するかですが、次の方法が良いでしょう。 1 普通にChromeで実際にアクセスします 2 112.96-97と買いてあるところで右クリックして検証を選びます 3 右側に表示された検証ウィンドウから112.96-97と買いてあるところを探し、右クリックして Copy - Copy selector を選びます

この手順により、このようなCSSセレクタが取得できたと思います。

#js-ticker_list > ul > li > div:nth-child(3) > a > span.m-miH01C_rate

あとはこのCSSセレクタを使用して、seleniumとchromedriverでこんな風にすれば、112.96-97という文字列を取り出すことができます。

from selenium import webdriver

url = "https://www.nikkei.com/"
selector = "#js-ticker_list > ul > li > div:nth-child(3) > a > span.m-miH01C_rate"

driver = webdriver.Chrome()
driver.get(url)

elements = driver.find_elements_by_css_selector(selector)
for e in elements:
    print (e.text)
driver.close()

たとえば、nikkei.py という名前で保存したとすると、

python3 nikkei.py

と実行します。すると実際にChromeが立ち上がって、読み込みが終わるまでしばらく待つと、ターミナルには112.96-97 と出力されます。

実際にChromeをたちあげたく無い場合はheadlessモード

headlessモードを使用すればChromeが見えなくなります。見えなくなるだけで実際には起動しています。JavaScirptの実行が終わらないと値が取得できないとか、今どんな状況かわからないとか、そういうよくわからない状況があるので、最初は実際にChromeが開いて読み込みが進んでいる様子と、ターミナルへの出力を一緒に眺めた方が動作確認しやすいと思います。

headlessモードを有効にした場合は、このような記述になります。selenium.webdriver.chrome.optionsを使うのがポイントです。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = "https://www.nikkei.com/"
selector = "#js-ticker_list > ul > li > div:nth-child(3) > a > span.m-miH01C_rate"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)
driver.get(url)

elements = driver.find_elements_by_css_selector(selector)
for e in elements:
    print (e.text)
driver.close()

epic passの価格を取り出す

本当にやりたかったのはこれでした。CSSセレクタを取り出すところまでは日経のときと同じですが、同様にやると問題が起きました。何も表示されないままスクリプトの実行が終わってしまいます。headlessモードを無効にしていると、まだぜんぜんページの表示が終わっていないのにスクリプトが終わっていることがわかりました。

時間を指定して適当に待つ

なんだかよくわからない場合、10秒ぐらい待てばなんとかなるだろうという考えのもと、time.sleepで待つのも良いと思います。とりあえず待てばなんとかなります。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

url = "https://www.epicpass.com/passes/epic-4-day.aspx"
selector = "#c27_Product_Detail_0 > div.col-xs-3.hidden-xs.pass_category_detail__price_col > span"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)

driver.get(url)
time.sleep(10)

elements = driver.find_elements_by_css_selector(selector)
for e in elements:
    print (e.text)
driver.close()

WebDriverWaitで待つ

指定した要素が表示されるまで待つ、ということもできます。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By

url = "https://www.epicpass.com/passes/epic-4-day.aspx"
selector = "#c27_Product_Detail_0 > div.col-xs-3.hidden-xs.pass_category_detail__price_col > span"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)
driver.get(url)
wait = WebDriverWait(driver, 10)
e = wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, selector)))
print (e.text)
driver.close()

正規表現で欲しい部分だけ取り出す

上記の方法で結果を取得したとき、目的の文字列が取り出せる場合とそうでない場合があります。例えば、価格をとりだしたかったのに取得した文字列がこんな風になっている場合があります。

$100 is the latest price! Buy now!

こういう場合は正規表現で欲しい部分だけ取り出すことができます。

import re
s = "$100 is the latest price! Buy now!"
r = "[0-9]+"
re.search(r, s).group()

本当は、"¥$[0-9]+" でマッチさせようと思ったんですが、なぜかマッチしませんでした。検索してもよくわからず。¥$ で $ をエスケープできているんじゃないんだろうか。わかる方教えてください。

というわけで、全ソースコードを貼っておきます。が、どうやらこれを実行するとAkamaiからマイナス評価を受けるみたいです。実行しないことをおすすめします。適当に待ち時間を入れればいいのかな。

続きを読む

前売りチケットの価格3

カリフォルニア州でスキーをするのに絶対に必要になるリフトチケットの価格調査3回目。しばらくさぼってしまいました。価格はどうなってるのでしょうか?チェックしていきましょう。

チケット 10/7 10/11 11/22
EPIC 4day $479 $489 $489
EPIC 7day $689 $709 $709
EPIC Tahoe local $589 $609 $609
ECPI Tahoe value $499 $519 %519
EPIC $929 $949 $949
Tahoe Super 4 $369 $369 $389
Sugar Bowl unrestricted $799 $799 $829
Sugar Bowl slightly restriced $589 $589 $619
IKON PASS $999 $1049 $1049
IKON BASE PASS $699 $749 $749

感想、大差ないですね。何ヶ月も前からお金を払っていくのかいかないのかそわそわし続けるよりは、サンクスギビングまで待ってから買えば良い、という気持ちになりました。ちなみにEPICはあと2日で値上がりするそうです。まあでもこの感じだとあがっても$20くらいなのかな、と思うとそんなに焦らなくてもいいような気がしますね。いや、$20もあったらスターバックス4回いけるやん、という方は急いで買いましょう。

ちなみに、それぞれのチケットでどこに行こうと思っているかというのがこちら。

チケット スキー場
EPIC 4/7 day, Tahoe local/value Heavenly, Northstar, Kirkwood
EPIC Heavenly, Northstar, Kirkwood (, Hakuba Valley)
IKON Squaw Valley (, Mammoth, Niseko United)
Tahoe Super 4 Squaw Valley (, Alpine Meadows)