Guides Using Hyperbrowser SessionUsing Hyperbrowser's session
In this guide, we will see how to use Hyperbrowser and Puppeteer to create a new session, connect to it, and scrape current weather data.
Setup
First, lets create a new Node.js project.
Copy mkdir weather-scraper && cd weather-scraper
npm init -y
Installation
Next, let's install the necessary dependencies to run our script.
Copy npm install @hyperbrowser/sdk puppeteer-core dotenv
Setup your Environment
To use Hyperbrowser with your code, you will need an API Key. You can get one easily from the dashboard . Once you have your API Key, add it to your .env
file as HYPERBROWSER_API_KEY
.
Code
Next, create a new file index.js
and add the following code:
Copy import { Hyperbrowser } from "@hyperbrowser/sdk" ;
import { config } from "dotenv" ;
import { connect } from "puppeteer-core" ;
config ();
const client = new Hyperbrowser ({
apiKey : process . env . HYPERBROWSER_API_KEY ,
});
const main = async () => {
const location = process .argv[ 2 ];
if ( ! location) {
console .error ( "Please provide a location as a command line argument" );
process .exit ( 1 );
}
console .log ( "Starting session" );
const session = await client . sessions .create ();
console .log ( "Session created:" , session .id);
try {
const browser = await connect ({ browserWSEndpoint : session .wsEndpoint });
const [ page ] = await browser .pages ();
await page .goto ( "https://openweathermap.org/city" , {
waitUntil : "load" ,
timeout : 20_000 ,
});
await page .waitForSelector ( ".search-container" , {
visible : true ,
timeout : 10_000 ,
});
await page .type ( ".search-container input" , location);
await page .click ( ".search button" );
await page .waitForSelector ( ".search-dropdown-menu" , {
visible : true ,
timeout : 10_000 ,
});
const [ response ] = await Promise .all ([
page .waitForNavigation () ,
page .click ( ".search-dropdown-menu li:first-child" ) ,
]);
await page .waitForSelector ( ".current-container" , {
visible : true ,
timeout : 10_000 ,
});
const locationName = await page .$eval (
".current-container h2" ,
(el) => el .textContent
);
const currentTemp = await page .$eval (
".current-container .current-temp" ,
(el) => el .textContent
);
const description = await page .$eval (
".current-container .bold" ,
(el) => el .textContent
);
const windInfo = await page .$eval ( ".weather-items .wind-line" , (el) =>
el . textContent .trim ()
);
const pressureInfo = await page .$eval (
".weather-items li:nth-child(2)" ,
(el) => el . textContent .trim ()
);
const humidityInfo = await page .$eval (
".weather-items li:nth-child(3)" ,
(el) => el . textContent .trim () ?.split ( ":" )[ 1 ]
);
const dewpoint = await page .$eval (
".weather-items li:nth-child(4)" ,
(el) => el . textContent .trim () ?.split ( ":" )[ 1 ]
);
const visibility = await page .$eval (
".weather-items li:nth-child(5)" ,
(el) => el . textContent .trim () ?.split ( ":" )[ 1 ]
);
console .log ( "\nWeather Information:" );
console .log ( "------------------" );
console .log ( `Location: ${ locationName } ` );
console .log ( `Temperature: ${ currentTemp } ` );
console .log ( `Conditions: ${ description } ` );
console .log ( `Wind: ${ windInfo } ` );
console .log ( `Pressure: ${ pressureInfo } ` );
console .log ( `Humidity: ${ humidityInfo } ` );
console .log ( `Dew Point: ${ dewpoint } ` );
console .log ( `Visibility: ${ visibility } ` );
console .log ( "------------------\n" );
await page .screenshot ({ path : "screenshot.png" });
await page .close ();
await browser .close ();
} catch (error) {
console .error ( `Encountered an error: ${ error } ` );
} finally {
await client . sessions .stop ( session .id);
console .log ( "Session stopped:" , session .id);
}
};
main () .catch ((error) => {
console .error ( `Encountered an error: ${ error } ` );
});
Run the Scraper
To run the weather scraper:
Open a terminal and navigate to your project directory
Run the script with a location argument:
Copy node index.js "New York"
Replace "New York"
with the location you want weather data for.
The script will:
Create a new Hyperbrowser session
Launch a Puppeteer browser and connect to the session
Navigate to the OpenWeatherMap city page
Search for the specified location and hit the Search button
Select the first option from a list in a dropdown menu and navigate to that page
Scrape the current weather data from the page
Print the weather information to the console
Save a screenshot of the page
Close the browser and stop the Hyperbrowser session
You should see output like:
Copy Weather Information:
------------------
Location: New York City, US
Temperature: 9°C
Conditions: overcast clouds
Wind: Gentle breeze, 3.6 m/s, west-southwest
Pressure: 1013 hPa
Humidity: 81%
Dew Point: 6°C
Visibility: 10 km
------------------
And a screenshot.png
file saved in your project directory.
How it Works
Let's break down the key steps:
We import the required libraries and load the environment variables
We create a new Hyperbrowser client with the API key
We start a new Hyperbrowser session with client.sessions.create()
We launch a Puppeteer browser and connect it to the Hyperbrowser session
We navigate to the OpenWeatherMap city page
We search for the location provided as a command line argument
We wait for the search results and click the first result
We scrape the weather data from the page using Puppeteer's page.$eval
method
We print the scraped data, take a screenshot, and save it to disk
Finally, we close the browser and stop the Hyperbrowser session
Next Steps
This example demonstrates a basic weather scraping workflow using a Hyperbrowser session. You can expand on it to:
Accept multiple locations and fetch weather data for each
Get the 8-day forecast for the location
Schedule the script to run periodically and save historical weather data