动态网页是指其内容并非完全直接嵌入在静态HTML中,而是通过服务器端或客户端渲染生成的网页。
它可以根据用户的操作实时显示数据,例如在用户点击按钮或向下滚动页面时加载更多内容(如无限滚动)。这种设计可以改善用户体验,并允许用户无需重新加载整个页面即可获得相关信息。
要判断一个网站是否是动态网页,可以在浏览器中禁用JavaScript。如果该网站是动态的,大多数内容将消失。
指纹识别技术: 许多网站使用指纹识别技术来检测和阻止自动爬虫。这些技术通过分析用户的浏览器行为、屏幕分辨率、插件、时区等信息来创建每个用户的唯一“指纹”。如果检测到异常或与正常用户行为不一致,网站可能会阻止访问。
封锁机制: 为了保护其内容,网站会实施各种封锁机制,例如:
你对网页抓取和 Browserless 有什么绝妙的想法或疑问吗?
让我们看看其他开发者在Discord 和Telegram 上分享了什么!
在抓取过程中拦截XHR(XMLHttpRequest)和Fetch请求的一种有效方法是检查浏览器的Network选项卡,以识别提供动态内容的API端点。一旦识别出这些端点,就可以使用HTTP客户端(如Requests库)直接向这些API发送请求以获取数据。
使用无头浏览器(如Puppeteer或Selenium)可以完全模拟用户行为,包括页面加载和交互。这些工具能够处理JavaScript并抓取动态生成的内容。
直接从网站的API请求数据是一种高效的抓取方式。分析网站的网络请求,找到API端点,并使用HTTP客户端请求数据。
通过监控网络请求,识别AJAX调用并重现它们,可以提取动态加载的数据。
为了避免被网站封锁,使用代理服务和IP轮换是一种重要的策略。这可以帮助分散请求,降低被检测到的风险。
编写脚本模拟人类浏览行为,例如在请求之间添加延迟,随机化操作顺序等,可以帮助降低被网站识别为爬虫的风险。
Browserless 是一种无头chrome云服务,它可以在没有图形用户界面的情况下运行在线应用程序和自动化脚本。对于网页抓取和其他自动化操作,它特别有用。
Browserless 也是一个强大的无头浏览器。接下来,我们将以Browserless为例来抓取动态网页。
在我们开始之前,我们需要拥有Browserless服务。使用Browserless可以解决复杂的网页抓取和大型自动化任务,并且现在已经实现了全托管云部署。
Browserless 采用浏览器为中心的策略,提供强大的无头部署能力,并提供更高的性能和可靠性。您可以点击此处 了解有关Browserless服务配置的更多信息。
在一开始,我们需要获取Nstbrowser的API KEY。您可以前往Nstbrowser客户端的Browserless菜单页面,也可以点击此处 访问。
在我们开始之前,让我们确定本次测试的目标。我们将使用Puppeteer和Playwright来获取动态网站的页面标题内容:
按照以下步骤安装依赖项:
npm init -y
pnpm add playwright puppeteer-core
const { chromium } = require('playwright');
async function createBrowser() {
const token = ''; // required
const config = {
proxy:
'', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
// platform: 'windows', // support: windows, mac, linux
// kernel: 'chromium', // only support: chromium
// kernelMilestone: '124', // support: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // browser args
// fingerprint: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // required
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await chromium.connectOverCDP(browserWSEndpoint);
const context = await browser.newContext();
const page = await context.newPage();
page.goto('https://www.nstbrowser.io/en');
// sleep for 5 seconds
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
const content = await h1Element?.textContent();
console.log(`Playwright: The content of the h1 element is: ${content}`)
await page.close();
await page.context().close();
}
createBrowser().then();
const puppeteer = require('puppeteer-core');
async function createBrowser() {
const token = ''; // required
const config = {
proxy:
'', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
// platform: 'windows', // support: windows, mac, linux
// kernel: 'chromium', // only support: chromium
// kernelMilestone: '124', // support: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // browser args
// fingerprint: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // required
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://www.nstbrowser.io/en');
// sleep for 5 seconds
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
if (h1Element) {
const content = await page.evaluate((el) => el.textContent, h1Element); // use page.evaluate to get the text content of the h1 element
console.log(`Puppeteer: The content of the h1 element is: ${content}`);
} else {
console.log('No h1 element found.');
}
await page.close();
}
createBrowser().then();
抓取动态网页总是比抓取普通网页更复杂。在抓取过程中很容易遇到各种麻烦。通过本博文的介绍,您一定已经学习到了: