Guest viewing is limited

Shinjuku JHT love hotel availability charts

biku

TAG Member
Joined
Oct 17, 2021
Messages
39
Reaction score
55
Since JHT publishes data on the number of rooms available at any time of the day, I tracked it for a week and put together everything into a spreadsheet. Tried to visualize with a stacked line chart below, if anyone wants the raw data I can share that too.

This sort of confirms my own experience that Wed-Fri 14:30+ is a really bad time to find a room.

upload_2022-4-3_0-41-52.png


upload_2022-4-3_0-47-6.png


upload_2022-4-3_0-47-32.png


upload_2022-4-3_0-47-43.png


upload_2022-4-3_0-47-57.png


upload_2022-4-3_0-48-24.png


upload_2022-4-3_0-48-32.png
 
This sort of confirms my own experience that Wed-Fri 14:30+ is a really bad time to find a room.

How can there be so many customers not working during those times! College students? Then again, a lot of DH girls only working during noon to late evenings. Very interesting.
 
How can there be so many customers not working during those times!
Go to any movie theatre in the afternoon pre-COVID and you'd see dozens of suits in seats. Usually sales guys killing time between calls (or pretending they're on calls when they're just loafing).
 
This is still a single week of data for 6 hotels. Would be interesting to see the model’s predictive ability going forward, even if just for the same hotels. Gotta think seasonality plays a big role etc.
 
  • Like
Reactions: Cinnabums
This is still a single week of data for 6 hotels. Would be interesting to see the model’s predictive ability going forward, even if just for the same hotels. Gotta think seasonality plays a big role etc.

Yes, probably seasonality, obviously holidays. Maybe location as well? This might be a good indication for Shinjuku overall, but maybe not a match for other areas.
 
Go to any movie theatre in the afternoon pre-COVID and you'd see dozens of suits in seats. Usually sales guys killing time between calls (or pretending they're on calls when they're just loafing).
My meet-ups coincide with the salesman theory. JHT overall also tends to be on the high-end of the cost spectrum, and they’re incredibly comfortable rooms. The category seems to be their target market.
 
Since JHT publishes data on the number of rooms available at any time of the day, I tracked it for a week and put together everything into a spreadsheet. Tried to visualize with a stacked line chart below, if anyone wants the raw data I can share that too.

This sort of confirms my own experience that Wed-Fri 14:30+ is a really bad time to find a room.

View attachment 17781

View attachment 17782

View attachment 17783

View attachment 17784

View attachment 17785

View attachment 17786

View attachment 17787
This is really cool. Thanks for the analysis biku.
 
  • Like
Reactions: biku
How can there be so many customers not working during those times! College students? Then again, a lot of DH girls only working during noon to late evenings. Very interesting.

If you're going take time off from work to see your second girlfriend, you probably would take the afternoon and combine it with lunch and then LH after that. So you'd be checking in from around 14:00~

But I agree, I also thought evenings would be just as busy, if not more.
 
  • Like
Reactions: AnotherTag
I'd be interested in knowing where the source of data is located. Could be interesting to consume into a database and track
 
I'd be interested in knowing where the source of data is located. Could be interesting to consume into a database and track
The data is publicly available on JHT's sites. You just need a simple front-end tool to scrape the data via a cron job or something.

Example:
Pasha - https://jht-pasha.jp/empty/ - This page is updated with available rooms and those that are being cleaned and being prepared. You could just poll this page every 30m or every hour to generate your own stats.

Only need to poll this tag:
HTML:
<div class="epEmptyRoomTxt">5室</div>
JMEX - https://jht-j-mex.jp/empty/ - Same approach and even format of the data being sent.
 
The data is publicly available on JHT's sites. You just need a simple front-end tool to scrape the data via a cron job or something.

Example:
Pasha - https://jht-pasha.jp/empty/ - This page is updated with available rooms and those that are being cleaned and being prepared. You could just poll this page every 30m or every hour to generate your own stats.

Only need to poll this tag:
HTML:
<div class="epEmptyRoomTxt">5室</div>
JMEX - https://jht-j-mex.jp/empty/ - Same approach and even format of the data being sent.
This is exactly what I did and let it run for a week
 
  • Like
Reactions: TAG Manager
Don't see any button for moving the posting to another section. That might required sysadmins.
We may re-use or reformat this data; but I have another idea I want to try first. (But yeah, we have to move it...)
 
  • Like
Reactions: biku
Code:
const HTMLParser = require('node-html-parser');
const normalizeWhitespace = require('normalize-html-whitespace');
const axios = require('axios').default;

const pages = {
    'fauchon': 'https://www.hotenavi.com/jht01/empty/?account_id=11',
    'dwave': 'https://www.hotenavi.com/jht02/empty/?account_id=11',
    'perrier': 'https://www.hotenavi.com/jht03/empty/?account_id=11',
    'jmex': 'https://www.hotenavi.com/jht04/empty/?account_id=11',
    'han-an': 'https://www.hotenavi.com/jht05/empty/?account_id=11',
    'pasha': 'https://www.hotenavi.com/jht06/empty/?account_id=11',
    'pasha-resort': 'https://www.hotenavi.com/jht07/empty/?account_id=11'

}

getPage = async (pageUrl) => {
    const response = await axios.get(pageUrl);
    const root = HTMLParser.parse(response.data);
    const value = root.querySelector('.epEmptyRoomTxt').firstChild._rawText;
    const normalized = normalizeWhitespace(value);
    return normalized.replace(' ','').replace('室','');
}

main = async () => {
    try {
        const pageKeys = Object.keys(pages);

        for(const pageKey of pageKeys) {
            const response = await getPage(pages[pageKey]);
            console.log(pageKey,':' , response);
            await sleep(10000);
        }
    }
    catch(error) {
        console.error(error);
    }
}

sleep = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
}

main();
Wrote a dirty little node script. The 10 second sleep between requests seems needed as the server quickly throttled any requests I made. I'm probably going to throw this in a docker container that is configurable to write to a mysql database.
 
Would suggest k8s with multiple node pools. At least 12-18 with maintained load inbound.
 
  • Like
Reactions: Cinnabums
Wrote a dirty little node script. The 10 second sleep between requests seems needed as the server quickly throttled any requests I made. I'm probably going to throw this in a docker container that is configurable to write to a mysql database.

You are not trying to DoS hotenavi.com are you? :LOL: but I would think any competent IT personnel would set up at leaset redimentary throttling of requests. That being said, I have doubts their systems would update that quickly so even every minute should be more than sufficient between refreshes. Hell, every 5 minutes is probably more than enough.

I wonder if hotenavi.com offers ome customization to show what your favorite hotels' availabilities are instead of having you check individual hotels that would be nice, but that would be too easy a feature for them to do so probably not. I also wonder how are the trends for other love hotels in other areas like Shibuya Dogenzaka, Gotanda, etc.
 
I wouldn't run it every second LOL. I'd have it on cron to run ever 15 minutes, but there are 7 hotels. I tried 1, 3, 5 second intervals and I had at least one of the 7 fail over time, 10 seconds seemed to be the happy place. I'd probably set it higher than 10, probably 30 or even 60 seconds. I suspect they have what ever in place to prevent exactly what I wrote, no User Agent, quick requests, probably a screen scraper. blocked.
 
I did 15 minute intervals, fetching each hotel page randomly 1-10 seconds apart, with Selenium controlling Firefox. No issues running that from a single IP for one week.
 
I did 15 minute intervals, fetching each hotel page randomly 1-10 seconds apart, with Selenium controlling Firefox. No issues running that from a single IP for one week.

That is probably the difference a browser with a user agent vs a node JS script making generic http get requests without a user agent. I should probably send a fake Chrome/Firefox user agent request just to satisfy those needs. Could also CSRF cookie related since I am not storing cookies. I did see references to that in the HTML I was parsing.