高级网站交互和API

Apr 14, 2025

欢迎来到第4节!我们已经涉及了静态和JavaScript渲染的内容提取,以及多页面网站的导航。现在,我们深入探讨更复杂的场景,包括API直接交互、表单提交、认证以及像GraphQL这样的专业化API。这些技术对于应对现代Web应用至关重要。

1. API驱动的网站(第7章)

许多现代网站并不在初始HTML中加载所有数据。相反,它们使用JavaScript在页面加载后从后端的API(通常使用fetchXMLHttpRequest)获取数据。高效爬取这些网站通常意味着绕过UI并直接与这些API交互。

关键概念:

  • 识别API请求: 使用浏览器的开发者工具(网络标签)发现返回数据的请求(通常是XHR/Fetch),这些数据通常以JSON格式呈现。
  • 直接爬取API: 一旦找到API端点,你通常可以使用诸如axios或Node.js中内置的fetch等库直接发请求。这通常比浏览器自动化更快速、更可靠。
  • 处理分页和参数: API通常使用查询参数进行分页(pagelimit)、过滤或排序。你需要在爬取脚本中理解并复制这些参数。

挑战(第7章): 你将爬取一个电子商务网站,其中产品列表是从一个RESTful API动态加载的。你的任务是通过与这个API交互来获取所有产品,并正确处理分页。

_solved/chapter7/目录中查找演示直接API爬取的参考解决方案。

2. 表单和认证(第8章)

通常,有价值的数据藏在登录界面后,或需要提交复杂的表单。例如,第8章中的旅行预订平台需要认证才能访问核心功能。要搜索目的地(使用自动完成)、选择旅行日期(与日历控件交互)、应用过滤器和查看结果(包括只对登录用户可用的高级列表),你首先需要自动化登录过程。这涉及处理表单、管理会话凭据(包括可能需要重新认证的超时和CSRF保护),并最终控制浏览器模拟真实用户的操作。

关键概念:

  • 自动表单提交: 使用像Playwright或Puppeteer等工具填充输入字段、选择选项并点击按钮来提交表单(如登录表单、搜索框、过滤控件)。
  • 管理认证:
    • 基于Cookie: 登录一次后,浏览器上下文(由Playwright/Puppeteer管理)通常会自动处理后续请求的会话凭据。
    • 基于令牌(如JWT): 登录后提取令牌(通常来自本地存储或API响应),并在后续的API请求中将其包含在标头中(如Authorization: Bearer <token>)。
  • 处理会话: 在爬虫的不同页面或操作间维持登录状态。
  • 访问受保护的内容: 认证后,你可以导航并爬取只有登录用户才能访问的页面或数据。

挑战(第8章): 这一章涉及多步骤过程:登录网站、导航到搜索页面、填写带有过滤器的复杂多部分表单、提取结果(包括只有登录后才能看到的高级内容),甚至将搜索保存到用户仪表板。

3. 使用GraphQL API(第9章)

GraphQL是REST API的一种越来越流行的替代品。它允许客户端使用特定的查询语言精确请求所需的数据。

关键概念:

  • GraphQL端点: 通常只有一个端点(如/graphql/api/graphql)。
  • 查询语言: 你需要构建一个GraphQL查询来指定要检索的字段和关系。工具如Insomnia或Postman可以帮助探索GraphQL架构。
  • 变更: 用于更改数据的操作(如登录或提交数据),类似于REST中的POST/PUT/DELETE。
  • 认证: 通常需要发送Authorization标头,类似于REST API,通常在登录变更后获得。

挑战(第9章): 你将与一个由GraphQL API支持的网站交互。任务是通过登录变更进行认证,然后使用GraphQL查询获取有关挑战和用户档案的特定结构化数据。

成功这些高级技术将大大扩展你能够有效爬取的网站和数据范围。请记住责任爬取,并尊重网站的服务条款。

爬取愉快!