前売りチケットの価格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サイトの高速化は非常に重要で、GoogleのSEO対策にもとにかく高速なレスポンスを、みたいなことが言われている。そこで活躍するのがCDNというサービスで、Akamaiが有名。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にはアクセスできなくならないのに楽天市場にはアクセスできなくなるんです。これが、各社どのような設定をしているのか不明なところです。
サポートチャットの担当が外国人
ちょっと困ったことがあってサポートサイトを見たら、チャットが用意されていた。よし、問い合わせようと思って開始してみたら、担当してくれたのが中国でトップ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の場合はスクレイピングしない方が安全です。
必要なソフトウェアたち
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) |