Nightmare.js is a high-level browser automation library for Node.js. It was designed to be simpler and more readable than alternatives like PhantomJS and Selenium, especially for tasks like web scraping. However, Nightmare itself does not have native functionality to emulate device-specific behaviors for mobile web scraping. It uses Electron under the hood, which is essentially a headless version of the Chromium browser.
To emulate mobile devices, you typically need to set the user agent string to that of a mobile device and set the viewport size to match the screen size of the device you're trying to emulate. While Nightmare does not have built-in functions specifically for mobile emulation, you can achieve mobile emulation by setting these parameters manually.
Here's how you can approach mobile emulation with Nightmare:
const Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });
const mobileUserAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1';
const viewport = {
width: 375, // iPhone 7 width
height: 667 // iPhone 7 height
};
nightmare
.useragent(mobileUserAgent)
.viewport(viewport.width, viewport.height)
.goto('https://example.com')
.evaluate(() => {
// Perform your scraping tasks here
return document.title;
})
.end()
.then((title) => {
console.log(title);
})
.catch((error) => {
console.error('Error:', error);
});
In this example, the useragent
method is used to set the User-Agent string to that of an iPhone running Chrome. The viewport
method sets the size of the window to mimic the screen size of an iPhone 7.
Keep in mind that this approach does not emulate all mobile-specific behaviors, such as touch events, device orientation, or geolocation features. For a more sophisticated emulation of mobile devices, you might want to consider using Puppeteer, which is a Node library that provides a high-level API over the Chrome DevTools Protocol.
Puppeteer has more extensive support for mobile emulation, including the ability to emulate device metrics, touch events, and more. Here's an example of how to use Puppeteer for mobile emulation:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.emulate(puppeteer.devices['iPhone 8']);
await page.goto('https://example.com');
// Perform your scraping tasks here
const pageTitle = await page.title();
console.log(pageTitle);
await browser.close();
})();
In this Puppeteer script, the emulate
method is used along with a predefined device descriptor from puppeteer.devices
. This not only sets the user agent and viewport size but also emulates other device-specific characteristics.
If you're looking to perform more complex mobile web scraping, where emulating device-specific behaviors is crucial, you might find Puppeteer to be a better tool for the job than Nightmare.