qidao123.com技术社区-IT企服评测·应用市场

标题: 使用Scrapeless Scraping Browser的自动化和网页抓取最佳实践 [打印本页]

作者: 水军大提督    时间: 6 天前
标题: 使用Scrapeless Scraping Browser的自动化和网页抓取最佳实践
弁言:人工智能期间浏览器自动化和数据收集的新范式

随着天生性人工智能、人工智能代理和数据麋集型应用步伐的快速崛起,浏览器正在从传统的“用户互动工具”演变为智能系统的“数据执行引擎”。在这一新范式中,很多任务不再依赖单一的API端点,而是通过自动化的浏览器控制来处置惩罚复杂的页面交互、内容抓取、任务编排和上下文检索。
从电商网站的价格比较和地图截图到搜索引擎结果剖析和社交媒体内容提取,浏览器正成为人工智能获取现实天下数据的重要接口。然而,现代网络结构的复杂性、强大的反呆板人措施和高并发需求给传统办理方案(如当地Puppeteer/Playwright实例或代理轮换策略)带来了庞大技能和操作挑战。
引入无爬虫抓取浏览器——一个专为大规模自动化构建的先辈云端浏览器平台。它降服了关键技能障碍,如反抓取机制、指纹检测和代理维护。此外,它提供了云原生并发调度、人类举动模拟和结构化数据提取,使其成为下一代自动化系统和数据管道的重要基础设施构成部分。
本文探究无爬虫抓取浏览器的核心本领及其在浏览器自动化和网络抓取中的现实应用。通过分析当前行业趋势和未来方向,我们旨在为开发者、产品构建者和数据团队提供全面且系统的指南。
一、背景:我们为什么需要无爬虫抓取浏览器?

1.1 浏览器自动化的演变

在人工智能驱动的自动化期间,浏览器不再仅仅是人机交互的工具——它们已成为获取结构化和非结构化数据的基本执行端点。在很多现实场景中,API要么不可用,要么受到限定,因此必须通过浏览器模拟人类举动进行数据收集、任务执行和信息提取。
常见用例包括:

传统的抓取办理方案(例如,当地运行的Puppeteer/Playwright或代理轮换设置)通常在高并发下表现不佳,频繁遭到反呆板人封锁,而且维护本钱高。无爬虫抓取浏览器凭借其云原生部署和真实浏览器举动模拟,为开发者提供了一个高可用、可靠的浏览器自动化平台——为人工智能自动化系统和数据工作流提供了关键基础设施。

1.2 反呆板人机制的挑战

与此同时,随着反呆板人技能的发展,传统爬虫工具越来越多地被目标网站标记为呆板人流量,导致IP被封和访问限定。常见的反抓取机制包括:

无爬虫抓取浏览器通过精确的浏览器指纹定制、内置的CAPTCHA办理方案和灵活的代理支持,有用降服了这些挑战,成为下一代自动化工具的核心基础设施。

二、无爬虫的核心本领

无爬虫抓取浏览器提供强大的核心本领,向用户提供稳定、高效和可扩展的数据交互功能。以下是其重要功能模块和技能细节:
2.1 真实浏览器环境

无爬虫创建在Chromium引擎之上,提供一个完整的浏览器环境,能够模拟真实用户举动。重要功能包括:

深度定制浏览器指纹

无爬虫提供全面的浏览器指纹定制,答应用户创建更“真实”的浏览环境:


2.2 基于云的部署和可扩展性

Scrapeless 完全部署在云端,并提供以下上风:

性能比较

与传统工具如 Selenium 和 Playwright 相比,Scrapeless 在高并发场景中表现优秀。以下是一个简单的比较表:
特性ScrapelessSeleniumPlaywright并发支持无限定(企业级定制)有限中等指纹定制先辈基本中等CAPTCHA 办理本领内置(98% 成功率)
支持 reCAPTCHA、Cloudflare Turnstile/Challenge、AWS WAF、DataDome 等外部依赖外部依赖 同时,Scrapeless 在高并发场景中表现优于其他竞争产品。以下是从不同维度总结的本领:
特性 / 平台ScrapelessBrowserlessBrowserbaseHyperBrowserBright DataZenRowsSteel.dev部署方式基于云的基于云的 Puppeteer 容器多浏览器云集群基于云的无头浏览器平台云部署浏览器 API 接口浏览器云集群 + 浏览器 API并发支持50 到无限3–503–501–250根据筹划最多可达无限多达 100(商业筹划)无官方数据反检测本领免费的 CAPTCHA 辨认与绕过,支持 reCAPTCHA、Cloudflare Turnstile/Challenge、AWS WAF、DataDome 等CAPTCHA 绕过CAPTCHA 绕过 + 隐私模式CAPTCHA 绕过 + 隐私 + 会话管理CAPTCHA 绕过 + 指纹伪造 + 代理自定义浏览器指纹代理 + 指纹辨认浏览器运行本钱每小时 $0.063 – $0.090(包括免费 CAPTCHA 绕过)每小时 $0.084 – $0.15(按单元)每小时 $0.10 – $0.198(包括 2–5GB 免费代理)每月 $30–$100每小时 ~$0.10每小时 ~$0.09每小时 $0.05 – $0.08代理本钱每 GB $1.26 – $1.80每 GB $4.3每 GB $10(超出免费配额)无官方数据每 GB $9.5(标准);每 GB $12.5(优质域名)每 GB $2.8 – $5.42每 GB $3 – $8.25 2.3 CAPTCHA 自动办理和变乱监控机制

Scrapeless 提供先辈的 CAPTCHA 办理方案,并通过 Chrome DevTools Protocol (CDP) 扩展一系列自定义功能,以加强浏览器自动化的可靠性。
CAPTCHA 办理本领

Scrapeless 可以自动处置惩罚主流 CAPTCHA 范例,包括:reCAPTCHA、Cloudflare Turnstile/Challenge、AWS WAF、DataDome 等等。
变乱监控机制

Scrapeless 提供了三个核心变乱用于监控 CAPTCHA 办理过程:
变乱名称描述Captcha.detected检测到 CAPTCHACaptcha.solveFinishedCAPTCHA 已办理Captcha.solveFailedCAPTCHA 办理失败 变乱响应数据结构

字段范例描述type字符串CAPTCHA 范例(例如:recaptcha, turnstile)success布尔值办理结果message字符串状态信息(例如:“NOT_DETECTED”,“SOLVE_FINISHED”)token?字符串成功时返回的令牌(可选) 2.4 强大的代理支持

Scrapeless 提供一个灵活可控的代理集成系统,支持多种代理模式:


2.5 会话重放

会话重放是 Scrapeless 抓取浏览器最强大的功能之一。它答应您逐页重放会话,以检查执行的操作和网络哀求。
3. 代码示例:Scrapeless 集成和使用

3.1 使用 Scrapeless 抓取浏览器

Puppeteer 示例
  1. const puppeteer = require('puppeteer-core');
  2. const connectionURL = 'wss://browser.scrapeless.com/browser?token=your-scrapeless-api-key&session_ttl=180&proxy_country=ANY';
  3. (async () => {
  4.     const browser = await puppeteer.connect({browserWSEndpoint: connectionURL});
  5.     const page = await browser.newPage();
  6.     await page.goto('https://www.scrapeless.com');
  7.     console.log(await page.title());
  8.     await browser.close();
  9. })();
复制代码
Playwright 示例
  1. const {chromium} = require('playwright-core');
  2. const connectionURL = 'wss://browser.scrapeless.com/browser?token=your-scrapeless-api-key&session_ttl=180&proxy_country=ANY';
  3. (async () => {
  4.     const browser = await chromium.connectOverCDP(connectionURL);
  5.     const page = await browser.newPage();
  6.     await page.goto('https://www.scrapeless.com');
  7.     console.log(await page.title());
  8.     await browser.close();
  9. })();
复制代码
3.2 Scrapeless 抓取浏览器指纹参数示例代码

以下是一个简单的示例代码,展示怎样通过 Puppeteer 和 Playwright 集成 Scrapeless 的浏览器指纹自定义功能:
Puppeteer 示例
  1. const puppeteer = require('puppeteer-core');
  2. // 自定义浏览器指纹
  3. const fingerprint = {
  4.     userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.1.2.3 Safari/537.36',
  5.     platform: 'Windows',
  6.     screen: {
  7.         width: 1280, height: 1024
  8.     },
  9.     localization: {
  10.         languages: ['zh-HK', 'en-US', 'en'], timezone: 'Asia/Hong_Kong',
  11.     }
  12. }
  13. const query = new URLSearchParams({
  14.   token: 'APIKey', // 必需
  15.   session_ttl: 180,
  16.   proxy_country: 'ANY',
  17.   fingerprint: encodeURIComponent(JSON.stringify(fingerprint)),
  18. });
  19. const connectionURL = `wss://browser.scrapeless.com/browser?${query.toString()}`;
  20. (async () => {
  21.     const browser = await puppeteer.connect({browserWSEndpoint: connectionURL});
  22.     const page = await browser.newPage();
  23.     await page.goto('https://www.scrapeless.com');
  24.     const info = await page.evaluate(() => {
  25.         return {
  26.             screen: {
  27.                 width: screen.width,
  28.                 height: screen.height,
  29.             },
  30.             userAgent: navigator.userAgent,
  31.             timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  32.             languages: navigator.languages
  33.         };
  34.     });
  35.     console.log(info);
  36.     await browser.close();
  37. })();
复制代码
Playwright 示例

  1. const { chromium } = require('playwright-core');
  2. // custom browser fingerprint
  3. const fingerprint = {
  4.     userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.1.2.3 Safari/537.36',
  5.     platform: 'Windows',
  6.     screen: {
  7.         width: 1280, height: 1024
  8.     },
  9.     localization: {
  10.         languages: ['zh-HK', 'en-US', 'en'], timezone: 'Asia/Hong_Kong',
  11.     }
  12. }
  13. const query = new URLSearchParams({
  14.   token: 'APIKey', // required
  15.   session_ttl: 180,
  16.   proxy_country: 'ANY',
  17.   fingerprint: encodeURIComponent(JSON.stringify(fingerprint)),
  18. });
  19. const connectionURL = `wss://browser.scrapeless.com/browser?${query.toString()}`;
  20. (async () => {
  21.     const browser = await chromium.connectOverCDP(connectionURL);
  22.     const page = await browser.newPage();
  23.     await page.goto('https://www.scrapeless.com');
  24.     const info = await page.evaluate(() => {
  25.         return {
  26.             screen: {
  27.                 width: screen.width,
  28.                 height: screen.height,
  29.             },
  30.             userAgent: navigator.userAgent,
  31.             timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  32.             languages: navigator.languages
  33.         };
  34.     });
  35.     console.log(info);
  36.     await browser.close();
  37. })();
复制代码

3.3 CAPTCHA变乱监控示例

以下是使用Scrapeless监控CAPTCHA变乱的完整代码示例,展示怎样及时监控CAPTCHA的办理状态:

  1. // 监听CAPTCHA解决事件
  2. const client = await page.createCDPSession();
  3. client.on('Captcha.detected', (result) => {
  4.   console.log('检测到CAPTCHA:', result);
  5. });
  6. await new Promise((resolve, reject) => {
  7.   client.on('Captcha.solveFinished', (result) => {
  8.     if (result.success) resolve();
  9.   });
  10.   client.on('Captcha.solveFailed', () =>
  11.     reject(new Error('CAPTCHA解决失败'))
  12.   );
  13.   setTimeout(() =>
  14.       reject(new Error('CAPTCHA解决超时')),
  15.     5 * 60 * 1000
  16.   );
  17. });
复制代码
掌握Scrapeless Scraping Browser的核心功能和上风后,我们不但可以更好地理解其在现代网页爬虫中的代价,还可以更有用地利用其性能上风。为了帮助开发人员更高效和安全地自动化和爬取网站,我们将探究怎样在特定用例中应用Scrapeless Scraping Browser,基于常见场景。
4. 使用Scrapeless Scraping Browser的自动化和网页爬虫最佳实践

   法律免责声明和防备措施
本教程涵盖了流行的网页爬虫技能,用于教育目标。与公共服务器的互动需要谨慎和尊重,以下是一些应避免的事项:
  
  理解Cloudflare掩护


Cloudflare是一个集成了内容分发网络(CDN)、DNS加速和安全掩护的云平台。网站使用Cloudflare来缓解分布式拒绝服务(DDoS)攻击(即由于多个访问哀求导致网站离线),并确保使用它的网站始终在线。
以下是一个简单的示例,用于理解Cloudflare的工作原理:
当您访问启用Cloudflare的网站(例如example.com)时,您的哀求起首到达Cloudflare的边沿服务器,而不是源服务器。Cloudflare将根据多条规则判断是否答应您的哀求继承,例如:

如果您被辨认为正当用户,Cloudflare将转发哀求到源服务器并将内容返回给您。此机制极大加强了网站的安全性,但也为自动访问带来了庞大挑战。
绕过Cloudflare是很多数据收集任务中的技能难题之一。接下来,我们将深入探究为何绕过Cloudflare是困难的。
固然有一些专门筹划用于绕过Cloudflare的开源工具(例如FlareSolverr, undetected-chromedriver),但这些工具通常寿命较短。一旦它们被广泛使用,Cloudflare会灵敏更新其检测规则以制止它们。这意味着,要以持续和稳定的方式绕过Cloudflare的掩护机制,团队通常需要内部开发本领以及持续的资源投入以进行维护和更新。
以下是绕过Cloudflare掩护的重要挑战:

因此,成功绕过 Cloudflare 需要模拟真实的浏览器举动、动态执行 JavaScript、灵活配置指纹,使用高质量的代理和动态调度机制。
使用 Scrapeless 爬虫浏览器绕过 Idealista 的 Cloudflare 收集房地产数据


在本章中,我们将演示怎样使用 Scrapeless 爬虫浏览器构建一个高效、稳定且抗反爬的自动化系统,从 Idealista 这一领先的欧洲房地产平台抓取房地产数据。Idealista 采用了多种掩护机制,包括 Cloudflare、动态加载、IP 速率限定和用户举动辨认,使其成为一个非常具有挑战性的目标平台。
我们将重点关注以下技能方面:

理解挑战:Idealista 的 Cloudflare 掩护

Idealista 是南欧领先的在线房地产平台,提供数百万条各种范例房产的列表,包括住宅、公寓和合租房。鉴于其房产数据的高度商业代价,该平台实施了严格的反爬虫措施。
为了抵御自动化抓取,Idealista 部署了 Cloudflare——一种广泛使用的防呆板人和安全掩护系统,旨在防御恶意呆板人、DDoS 攻击和数据滥用。Cloudflare 的反抓取机制重要由以下元素构成:

接下来,我们将详细表明怎样使用 Scrapeless 爬虫浏览器绕过 Idealista 的 Cloudflare 掩护并成功收集房地产数据。
使用 Scrapeless 爬虫浏览器绕过 Idealista 的 Cloudflare


前提条件

在开始之前,让我们确保我们拥有必要的工具:

定位数据

我们的目标是提取 Idealista 上每个房产列表的详细信息。我们可以使用浏览器的开发者工具来了解网站的结构并辨认需要定位的 HTML 元素。
右键单击页面上的恣意位置,选择 检查 以查看页面源代码。
在这篇文章中,我们将重点先容怎样使用以下网址从马德里阿尔卡拉-德-海纳雷斯抓取物业列表:
https://www.idealista.com/venta-viviendas/alcala-de-henares-madrid/
我们希望从每个列表中提取以下数据点:

下面您可以看到带注释的房产列表页面,显示每个房源信息的位置。
通过检查HTML源代码,我们可以辨认每个数据点的CSS选择器。CSS选择器是用于选择HTML文档中元素的模式。
通过检查HTML源代码,我们发现每个房产列表都包罗在带有类 item 的 <article> 标签内。在每个项目内:

步骤1:使用ChromeDriver设置Selenium

起首,我们需要配置Selenium以使用ChromeDriver。起首设置chrome_options并初始化ChromeDriver。

  1. from seleniumwire import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.chrome.options import Options
  4. from bs4 import BeautifulSoup
  5. import time
  6. from datetime import datetime
  7. import json
  8. def listings(url):
  9.     chrome_options = Options()
  10.     chrome_options.add_argument("--headless")
  11.     s = Service("替换为您的ChromeDriver路径")
  12.     driver = webdriver.Chrome(service=s, chrome_options=chrome_options)
复制代码
这段代码导入了必要的模块,包括用于高级浏览器交互的seleniumwire和用于HTML剖析的BeautifulSoup。
我们定义了一个函数listings(url),并通过向chrome_options添加--headless参数来配置Chrome在无头模式下运行。然后,使用指定的服务路径初始化ChromeDriver。
步骤2:加载目标网址

接下来,我们加载目标网址并等待页面完全加载。

  1.     driver.get(url)
  2.     time.sleep(8)  # 根据网站的加载时间进行调整
复制代码
在这里,driver.get(url)命令指示浏览器导航到指定URL。
我们使用time.sleep(8)使脚本暂停8秒,确保网页完全加载。这个等待时间可以根据网站的加载速度进行调解。
步骤3:剖析页面内容

页面加载完成后,我们使用BeautifulSoup剖析其内容:

  1.     soup = BeautifulSoup(driver.page_source, "lxml")
  2.     driver.quit()
复制代码
在这里,我们使用driver.page_source获取加载页面的HTML内容,并使用lxml剖析器通过BeautifulSoup剖析它。最后,我们调用driver.quit()关闭浏览器实例并释放资源。
步骤4:从剖析的HTML中提取数据

接下来,我们从剖析的HTML中提取相干数据。

  1.     house_listings = soup.find_all("article", class_="item")
  2.     extracted_data = []
  3.     for listing in house_listings:
  4.         description_elem = listing.find("div", class_="item-description")
  5.         description_text = description_elem.get_text(strip=True) if description_elem else "nil"
  6.         item_details = listing.find_all("span", class_="item-detail")
  7.         bedrooms = item_details[0].get_text(strip=True) if len(item_details) > 0 else "nil"
  8.         area = item_details[1].get_text(strip=True) if len(item_details) > 1 else "nil"
  9.         image_urls = [img["src"] for img in listing.find_all("img") if img.get("src")]
  10.         first_image_url = image_urls[0] if image_urls else "nil"
  11.         listing_info = {
  12.             "标题": listing.find("a", class_="item-link").get("title", "nil"),
  13.             "价格": listing.find("span", class_="item-price").get_text(strip=True),
  14.             "卧室": bedrooms,
  15.             "面积": area,
  16.             "描述": description_text,
  17.             "图片网址": first_image_url,
  18.         }
  19.         extracted_data.append(listing_info)
复制代码
在这里,我们查找全部匹配带有类名 item 的article标签的元素,表现各个房产列表。对于每个列表,我们提取其标题、细节(如寝室数量和面积)以及图片网址。我们将这些细节存储在一个字典中,并将每个字典附加到名为extracted_data的列表中。
步骤5:生存提取的数据

最后,我们将提取的数据生存到JSON文件中。

  1.    current_datetime = datetime.now().strftime("%Y%m%d%H%M%S")
  2.     json_filename = f"new_revised_data_{current_datetime}.json"
  3.     with open(json_filename, "w", encoding="utf-8") as json_file:
  4. ```json
  5. json.dump(extracted_data, json_file, ensure_ascii=False, indent=2)
  6.     print(f"提取的数据已保存到 {json_filename}")
  7. url = "https://www.idealista.com/venta-viviendas/alcala-de-henares-madrid/"
  8. idealista_listings = listings(url)
复制代码
这里是完整的代码:
  1. from seleniumwire import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.chrome.options import Options
  4. from bs4 import BeautifulSoup
  5. import time
  6. from datetime import datetime
  7. import json
  8. def listings(url):
  9.     chrome_options = Options()
  10.     chrome_options.add_argument("--headless")
  11.     s = Service("替换为您的ChromeDriver路径")
  12.     driver = webdriver.Chrome(service=s, chrome_options=chrome_options)    driver.get(url)
  13.     time.sleep(8)  # 根据网站的加载时间进行调整    soup = BeautifulSoup(driver.page_source, "lxml")
  14.     driver.quit()    house_listings = soup.find_all("article", class_="item")
  15.     extracted_data = []
  16.     for listing in house_listings:
  17.         description_elem = listing.find("div", class_="item-description")
  18.         description_text = description_elem.get_text(strip=True) if description_elem else "nil"
  19.         item_details = listing.find_all("span", class_="item-detail")
  20.         bedrooms = item_details[0].get_text(strip=True) if len(item_details) > 0 else "nil"
  21.         area = item_details[1].get_text(strip=True) if len(item_details) > 1 else "nil"
  22.         image_urls = [img["src"] for img in listing.find_all("img") if img.get("src")]
  23.         first_image_url = image_urls[0] if image_urls else "nil"
  24.         listing_info = {
  25.             "标题": listing.find("a", class_="item-link").get("title", "nil"),
  26.             "价格": listing.find("span", class_="item-price").get_text(strip=True),
  27.             "卧室": bedrooms,
  28.             "面积": area,
  29.             "描述": description_text,
  30.             "图片网址": first_image_url,
  31.         }
  32.         extracted_data.append(listing_info)    current_datetime = datetime.now().strftime("%Y%m%d%H%M%S")    json_filename = f"new_revised_data_{current_datetime}.json"    with open(json_filename, "w", encoding="utf-8") as json_file:        json.dump(extracted_data, json_file, ensure_ascii=False, indent=2)    print(f"提取的数据已生存到 {json_filename}")url = "https://www.idealista.com/venta-viviendas/alcala-de-henares-madrid/"idealista_listings = listings(url)
复制代码
  1. [/code] [size=3]绕过呆板人检测[/size]
  2. 如果您在本教程中至少运行过两次脚本,您可能已经留意到出现了一个 CAPTCHA 页面。
  3. Cloudflare 挑战页面最初加载 cf-chl-bypass 脚本并执行 JavaScript 计算,这通常需要约莫 5 秒。
  4. Scrapeless 提供了一种简单可靠的方法来访问如 Idealista 等网站的数据,而无需构建和维护自己的抓取基础设施。Scrapeless 抓取浏览器是一种高并发自动化办理方案,专为人工智能打造。它是一种高性能、本钱效益高、抗封锁的浏览器平台,旨在大规模数据抓取,并模拟高度人类化的举动。它可以及时处置惩罚 reCAPTCHA、Cloudflare Turnstile/Challenge、AWS WAF、DataDome 等,使其成为高效的网络抓取办理方案。
  5. 以下是使用 Scrapeless 绕过 Cloudflare 掩护的步骤:
  6. [size=2]步骤 1:预备[/size]
  7. [size=1]1.1 创建项目文件夹[/size]
  8. [list]
  9. [*]创建一个新的项目文件夹,例如 scrapeless-bypass。
  10. [*]在终端中导航到该文件夹:
  11. [/list]
  12. [code]cd path/to/scrapeless-bypass
复制代码
1.2 初始化 Node.js 项目

运行以下命令以创建 package.json 文件:

  1. npm init -y
复制代码
1.3 安装所需依赖项

安装 Puppeteer-core,答应长途毗连到浏览器实例:

  1. npm install puppeteer-core
复制代码
如果您的系统上尚未安装 Puppeteer,则安装完整版本:

  1. npm install puppeteer puppeteer-core
复制代码
步骤 2:获取您的 Scrapeless API 密钥

2.1 在 Scrapeless 上注册




步骤 3:毗连到 Scrapeless 无浏览器

3.1 获取 WebSocket 毗连 URL

Scrapeless 提供 Puppeteer 使用 WebSocket 毗连 URL 与云端浏览器进行交互。
格式为:

  1. wss://browser.scrapeless.com/browser?token=APIKey&session_ttl=180&proxy_country=ANY
复制代码
  将 APIKey 替换为您的现实 Scrapeless API 密钥。
  3.2 配置毗连参数



第4步:编写Puppeteer脚本

4.1 创建脚本文件

在您的项目文件夹中,创建一个名为bypass-cloudflare.js的新JavaScript文件。
4.2 毗连到Scrapeless并启动Puppeteer

将以下代码添加到bypass-cloudflare.js中:

  1. import puppeteer from 'puppeteer-core';
  2. const API_KEY = 'your_api_key'; // 用实际API密钥替换
  3. const host = 'wss://browser.scrapeless.com';
  4. const query = new URLSearchParams({token: API_KEY, session_ttl: '180', // 浏览器会话持续时间(秒)proxy_country: 'GB', // 代理国家代码proxy_session_id: 'test_session', // 代理会话ID(保持相同IP)proxy_session_duration: '5' // 代理会话持续时间(分钟)
  5. }).toString();
  6. const connectionURL = `${host}/browser?${query}`;
  7. const browser = await puppeteer.connect({browserWSEndpoint: connectionURL, defaultViewport: null,
  8. });
  9. console.log('连接到Scrapeless');
复制代码
4.3 打开网页并绕过Cloudflare

扩展脚本以打开新页面并导航到Cloudflare掩护的网站:

  1. const page = await browser.newPage();
  2. await page.goto('https://www.scrapingcourse.com/cloudflare-challenge', { waitUntil: 'domcontentloaded' });
复制代码
4.4 等待页面元素加载

在继承之前确保绕过Cloudflare掩护:

  1. await page.waitForSelector('main.page-content .challenge-info', { timeout: 30000 }); // 根据需要调整选择器
复制代码
4.5 截取屏幕截图

为验证Cloudflare掩护是否已成功绕过,截取页面的屏幕截图:

  1. await page.screenshot({ path: 'challenge-bypass.png' });
  2. console.log('屏幕截图已保存为 challenge-bypass.png');
复制代码
4.6 完整脚本

以下是完整脚本:
  1. import puppeteer from 'puppeteer-core';
  2. const API_KEY = 'your_api_key'; // 用实际API密钥替换
  3. const host = 'wss://browser.scrapeless.com';
  4. const query = new URLSearchParams({
  5.   token: API_KEY,
  6.   session_ttl: '180',
  7.   proxy_country: 'GB',
  8.   proxy_session_id: 'test_session',
  9.   proxy_session_duration: '5'
  10. }).toString();
  11. const connectionURL = `${host}/browser?${query}`;
  12. (async () => {
  13.   try {
  14.     // 连接到Scrapeless
  15.     const browser = await puppeteer.connect({
  16.       browserWSEndpoint: connectionURL,
  17.       defaultViewport: null,
  18.     });
  19.     console.log('连接到Scrapeless');
  20.     // 打开新页面并导航到目标网站
  21.     const page = await browser.newPage();
  22.     await page.goto('https://www.scrapingcourse.com/cloudflare-challenge', { waitUntil: 'domcontentloaded' });
  23.     // 等待页面完全加载
  24.     await page.waitForTimeout(5000); // 如有必要可调整延迟
  25.     await page.waitForSelector('main.page-content', { timeout: 30000 });
  26.     // 截取屏幕截图
  27.     await page.screenshot({ path: 'challenge-bypass.png' });
  28.     console.log('屏幕截图已保存为 challenge-bypass.png');
  29.     // 关闭浏览器
  30.     await browser.close();
  31.     console.log('浏览器已关闭');
  32.   } catch (error) {
  33.     console.error('错误:', error);
  34.   }
  35. })();
复制代码
  1. [/code] [size=2]第5步:运行脚本[/size]
  2. [size=1]5.1 生存脚本[/size]
  3. 确保将脚本生存为bypass-cloudflare.js。
  4. [size=1]5.2 执行脚本[/size]
  5. 使用Node.js运行脚本:
  6. [code]node bypass-cloudflare.js
复制代码
5.3 预期输出

如果一切设置正确,终端将显示:

  1. 连接到Scrapeless
  2. 屏幕截图已保存为 challenge-bypass.png
  3. 浏览器已关闭
复制代码
challenge-bypass.png文件将出如今您的项目文件夹中,确认Cloudflare掩护已成功绕过。
您还可以将Scrapeless抓取浏览器直接集成到您的抓代替码中:

  1. const puppeteer = require('puppeteer-core');
  2. const connectionURL = 'wss://browser.scrapeless.com/browser?token=C4778985476352D77C08ECB031AF0857&session_ttl=180&proxy_country=ANY';
  3. (async () => {
  4.     const browser = await puppeteer.connect({browserWSEndpoint: connectionURL});
  5.     const page = await browser.newPage();
  6.     await page.goto('https://www.scrapeless.com');
  7.     console.log(await page.title());
  8.     await browser.close();
  9. })();
复制代码
指纹自定义

在抓取网站数据时——尤其是像Idealista这样的大型房地产平台——即使您成功绕过了Cloudflare挑战,通过Scrapeless,仍旧可能由于重复或高频率的访问被标记为呆板人。
网站通常使用浏览器指纹辨认来检测自动化举动并限定访问。

⚠️ 常见题目



这些题目通常是由于每个哀求的浏览器配置类似造成的。如果您的浏览器指纹保持稳定,反呆板人系统就容易检测到自动化。

办理方案:使用 Scrapeless 自定义指纹

Scrapeless 抓取浏览器 提供了内置的指纹自定义支持,以模拟真实用户举动并避免被检测。
您可以 随机化或自定义 以下指纹元素:
指纹元素描述用户代理模拟各种操作系统/浏览器组合(例如,Windows/Mac上的Chrome)。平台模拟不同的操作系统(Windows、macOS 等)。屏幕大小仿真各种设备分辨率,以避免移动/桌面不匹配。当地化与地理位置一致对齐语言和时区。
通过旋转或自定义这些值,每个哀求看起来更自然——减少被检测的风险,提高数据提取的可靠性。
代码示例:

  1. const puppeteer = require('puppeteer-core');
  2. const query = new URLSearchParams({
  3.   token: 'your-scrapeless-api-key', // 必需
  4.   session_ttl: 180,
  5.   proxy_country: 'ANY',
  6.   // 设置指纹参数
  7.   userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.45 Safari/537.36',
  8.   platform: 'Windows',
  9.   screen: JSON.stringify({ width: 1280, height: 1024 }),
  10.   localization: JSON.stringify({
  11.     locale: 'zh-HK',
  12.     languages: ['zh-HK', 'en-US', 'en'],
  13.     timezone: 'Asia/Hong_Kong',
  14.   })
  15. });
  16. const connectionURL = `wss://browser.Scrapeless.com/browser?${query.toString()}`;
  17. (async () => {
  18.     const browser = await puppeteer.connect({browserWSEndpoint: connectionURL});
  19.     const page = await browser.newPage();
  20.     await page.goto('https://www.Scrapeless.com');
  21.     console.log(await page.title());
  22.     await browser.close();
  23. })();
复制代码
会话重放

在自定义浏览器指纹后,页面稳定性显著提高,内容提取变得更加可靠。
然而,在大规模抓取操作期间,意外题目仍可能导致提取失败。为此,Scrapeless 提供了强大的 会话重放 功能。

什么是会话重放?

会话重放详细记录整个浏览器会话,捕捉全部交互,如:


为什么使用会话重放?

在抓取复杂网站如 Idealista 时,会话重放可以大大提高调试效率。
益处描述精确题目追踪快速辨认失败的哀求,无需猜测无需重新运行代码直接从重放中分析题目,而不是重新运行抓取器改善协作与团队成员共享重放日志以便于故障排除动态内容分析理解在抓取过程中动态加载的数据怎样表现
使用提示

一旦 会话重放 启用,抓取失败或数据看起来不完整时,起首检查重放日志。这有助于您更快地诊断题目,减少调试时间。
代理配置

在抓取 Idealista 时,重要的是要留意该平台对非当地 IP 地址高度敏感——尤其是在访问特定都会的列表时。如果您的 IP 来源于国外,Idealista 可能会:


Scrapeless 内置代理支持

Scrapeless 提供 内置代理配置,答应您直接指定地理来源。
您可以通过以下任一方式进行配置:

示例用法:

  1. proxy_country: 'ES',
复制代码
高并发

我们刚刚从 Idealista 抓取的页面——阿尔卡拉·德·埃纳雷斯房产列表——有多达 6 页的列表。
当您研究行业趋势或收集竞争营销策略时,可能需要每天从 20+ 个都会 抓取房地产数据,涵盖 数千个页面。在某些情况下,您甚至可能需要每小时刷新这些数据。


高并发要求

为高效处置惩罚这种容量,请考虑以下要求:


无痛扩展性

Scrapeless专门为高并发抓取筹划。它提供:


   提示:确保您的哀求间隔合理,以模拟人类的浏览举动,防止Idealista的速率限定或封禁。
  扩展性与本钱效率

常规的Puppeteer在高效扩展会话和与列队系统集成方面表现不佳。然而,Scrapeless Scraping Browser支持从数十个并发会话到无限并发会话的无缝扩展,确保即使在高峰任务负载期间也零列队时间和零超时
以下是各种高并发抓取工具的比较。即使使用Scrapeless的高并发浏览器,您也无需担心本钱——现实上,它可以帮助您节省近**50%**的费用。

工具比较

工具名称小时费率 (美元/小时)代理费用 (美元/GB)并发支持Scrapeless$0.063 – $0.090/小时 (取决于并发性和使用情况)$1.26 – $1.80/GB50 / 100 / 200 / 400 / 600 / 1000 / 无限定Browserbase$0.10 – $0.198/小时 (包罗2-5GB免费代理)$10/GB(超出免费分配后)3(基础) / 50(高级)Brightdata$0.10/小时$9.5/GB(标准);$12.5/GB(高级域名)无限Zenrows$0.09/小时$2.8 – $5.42/GB高达100Browserless$0.084 – $0.15/小时 (基于使用单元计费)$4.3/GB3 / 10 / 50   提示:如果您需要大规模抓取高并发支持Scrapeless提供最佳的性价比。
  网络抓取的本钱控制策略

细致的用户可能已经留意到,我们抓取的Idealista页面通常包罗大量高清地产图片、互动地图、视频演示和广告脚本。尽管这些元素对终极用户友好,但对数据提取而言是不必要的,并显著增加了带宽消耗和本钱。


为了优化流量使用,我们发起用户采用以下策略:

详细策略

1. 资源拦截

启用资源拦截可以显著提高抓取效率。通过配置Puppeteer的setRequestInterception函数,我们可以制止图像、媒体、字体和样式表等资源的加载,从而避免下载大量内容。
2. 哀求URL过滤

通过检查哀求URL,我们可以过滤掉与数据提取无关的无效哀求,如广告服务和第三方分析脚本。这降低了不必要的网络流量。
3. 模拟移动设备

模拟移动设备(例如,将用户代理设置为iPhone)答应您获取更轻的、颠末移动优化的页面版本。这会导致加载的资源更少,从而加速抓取过程。
   要获取更多信息,请参考Scrapeless官方文档
  
示例代码

以下是使用Scrapeless Cloud Browser + Puppeteer的示例代码,展示怎样结合这三种策略进行优化资源抓取:

  1. import puppeteer from 'puppeteer-core';
  2. const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
  3. async function scrapeWithResourceBlocking(url) {
  4.     const browser = await puppeteer.connect({
  5.         browserWSEndpoint: scrapelessUrl,
  6.         defaultViewport: null
  7.     });
  8.     const page = await browser.newPage();
  9.     // Enable request interception
  10.     await page.setRequestInterception(true);
  11.     // Define resource types to block
  12.     const BLOCKED_TYPES = new Set([
  13.         'image',
  14.         'font',
  15.         'media',
  16.         'stylesheet',
  17.     ]);
  18.     // Intercept requests
  19.     page.on('request', (request) => {
  20.         if (BLOCKED_TYPES.has(request.resourceType())) {
  21.             request.abort();
  22.             console.log(`Blocked: ${request.resourceType()} - ${request.url().substring(0, 50)}...`);
  23.         } else {
  24.             request.continue();
  25.         }
  26.     });
  27.     await page.goto(url, {waitUntil: 'domcontentloaded'});
  28.     // Extract data
  29.     const data = await page.evaluate(() => {
  30.         return {
  31.             title: document.title,
  32.             content: document.body.innerText.substring(0, 1000)
  33.         };
  34.     });
  35.     await browser.close();
  36.     return data;
  37. }
  38. // Usage
  39. scrapeWithResourceBlocking('https://www.scrapeless.com')
  40.     .then(data => console.log('Scraping result:', data))
  41.     .catch(error => console.error('Scraping failed:', error));
复制代码
通过这种方式,您不但可以节省高额的流量费用,还能在确保数据质量的同时提高爬取速度,从而改善系统的整体稳定性和效率。
5. 安全和合规发起

在使用Scrapeless进行数据爬取时,开发人员应留意以下事项:


6. 结论

在大数据期间,数据收集已成为各行业数字化转型的关键基础。尤其是在市场谍报、电子商务价格比较、竞争分析、金融风险管理和房地产分析等范畴,对数据驱动决策的需求愈加急迫。然而,随着网络技能的持续演变,特别是动态加载内容的广泛使用,传统网页爬虫渐渐表现出其范围性。这些范围性不但使爬取变得更加困难,而且导致反爬机制的升级,提高了网页爬取的门槛。
随着网络技能的进步,传统爬虫已无法满足复杂爬取需求。以下是一些重要挑战及相应办理方案:

因此,基于浏览器的爬虫已成为行业的新趋势。这项技能不但通过真实浏览器模拟用户举动,还灵活应对现代网站的复杂结构和反爬机制,为开发人员提供更稳定和高效的爬取办理方案。
Scrapeless抓取浏览器顺应这一技能趋势,通过结合浏览器渲染、代理管理、反检测技能和高并发任务调度,帮助开发人员在复杂的在线环境中高效稳定地完成数据爬取任务。它通过几个核心上风提高爬取效率和稳定性:

无论是抓取电子商务平台以进行价格比较,提取房地产网站数据,照旧应用于金融风险监测和市场谍报分析,Scrapeless为各种行业提供高效、智能和可靠的办理方案。
通过本文涵盖的技能细节和最佳实践,您如今了解怎样利用Scrapeless进行大规模数据抓取。无论是处置惩罚动态页面、提取复杂的交互数据、优化流量使用,照旧降服反抓取机制,Scrapeless都能帮助您快速高效地实现抓取目标。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4