计网应用层

25 年 6 月 2 日 星期一
3070 字
16 分钟

一、核心概念

  • Protocol

通信双方之间交换信息的规则和标准,规定了消息的格式,传输方式,顺序以及错误处理等(也就是爬虫程序&Web服务器)

爬虫严格遵守目标服务器的应用层协议(HTTPS/HTTP)来构造请求和解析响应

  • Clinet/Server Model

最流行的交互模式了,浏览器发起请求,服务器被动响应并提供服务

  • Service

应用层协议提供功能:HTTP提供Web资源获取服务,SMTP提供邮件发送服务

爬虫比较关注HTTP(Web资源获取)和DNS(域名解析)

  • API

操作系统或库给应用程序一组预定义函数/结果

爬虫使用py

aiohttp urllib ...提供的网络库API发送请求,接收响应,处理Cookies,Session等,这些库封装了Socket 操作

二、 爬虫核心应用层协议详解

1. HTTP/HTTPS (HyperText Transfer Protocol / Secure) - 爬虫的生命线

  • 核心作用: 用于在Web上传输超文本(HTML)以及其他资源(图片、CSS、JS、JSON、XML等)。爬虫获取网页内容完全依赖此协议。
  • 关键概念与爬虫应用:
    • 请求/响应模型 (Request/Response):
      • 请求 (Request): 爬虫构造并发送给服务器。包含:
        • 方法 (Method): GET (获取资源,主要方式), POST (提交数据,如登录、搜索), HEAD (获取资源头信息), PUT, DELETE等。爬虫最常用GETPOST
        • URL (Uniform Resource Locator): 统一资源定位符。爬虫的目标地址。https://www.example.com/path/page?query=param#fragment
        • 头部 (Headers): 极其重要! 包含元信息。爬虫必须关注/设置:
          • User-Agent: 模拟浏览器身份(对抗基础反爬)。
          • Cookie: 维持会话状态(登录态、用户标识)。
          • Referer: 表示请求来源页面(有时反爬会检查)。
          • Host: 目标主机。
          • Accept/Accept-Encoding/Accept-Language: 声明客户端能处理的内容类型、编码、语言。
          • Connection: 控制连接(如keep-alive复用连接)。
          • Authorization: 基本认证或Bearer Token(用于API)。
          • 自定义Headers: 有些反爬会检查特定Header是否存在或值是否正确。
        • 主体 (Body): POST/PUT等方法携带的数据(如表单数据application/x-www-form-urlencoded, multipart/form-data,或JSON application/json)。
      • 响应 (Response): 服务器返回给爬虫的结果。包含:
        • 状态码 (Status Code): 200 OK (成功), 301/302 (重定向), 404 Not Found, 403 Forbidden (常见反爬), 429 Too Many Requests (速率限制), 500 Internal Server Error爬虫必须处理各种状态码!
        • 响应头 (Headers): 包含服务器信息、设置Cookie、内容信息等。爬虫关注:
          • Set-Cookie: 服务器设置Cookie(需要保存用于后续请求)。
          • Content-Type: 响应体类型(text/html, application/json, image/jpeg等 - 决定如何解析)。
          • Content-Length: 响应体长度。
          • Location: 重定向的目标URL(处理3xx状态码)。
          • Cache-Control/Expires: 缓存控制。
        • 响应体 (Body): 核心目标! 网页HTML、JSON数据、图片二进制流等。爬虫需要根据Content-Type进行解析(HTML解析用BeautifulSoup, lxml, pyquery;JSON用内置json库;图片/文件保存二进制)。
    • 无状态性 (Stateless) 与 Session/Cookie:
      • HTTP本身不记录之前的请求信息。服务器使用Session(存储在服务器端)和Cookie(存储在客户端,由Set-Cookie设置,后续请求在Cookie头中带回)来跟踪用户状态(如登录)。
      • 爬虫关键: 爬虫必须管理Cookie(使用requests.Session()或手动维护CookieJar)。对于需要登录的网站,通常先模拟登录请求获取Cookie,后续请求携带该Cookie。有时还需处理复杂的Session机制(如Token)。
    • 连接管理:
      • 短连接: HTTP/1.0默认,每次请求建立新TCP连接(效率低)。
      • 长连接 (Keep-Alive): HTTP/1.1默认,一个TCP连接上可发送多个请求/响应(提高效率)。爬虫库(如requests)通常自动支持复用连接。异步爬虫(aiohttp, Scrapy)更高效地利用连接。
    • HTTPS (HTTP over SSL/TLS):
      • 核心: 在HTTP下层加入SSL/TLS层进行加密认证,保证传输安全。
      • 爬虫处理: 现代爬虫库(requests, aiohttp等)默认支持HTTPS,无需额外配置基础SSL。但需注意:
        • 证书验证: 库默认会验证服务器证书有效性。遇到无效证书(如自签名证书)时,可设置verify=False有安全风险,仅用于测试或信任的环境)。
        • SNI (Server Name Indication): 现代库都支持,允许一个IP托管多个HTTPS域名。
        • TLS指纹: 高级反爬可能检测客户端(爬虫)的TLS握手特征(如支持的加密套件顺序、扩展)。对抗需要更底层的库(如curl_cffi模拟浏览器指纹)或代理。
  • 版本:
    • HTTP/1.1: 当前最广泛。支持长连接、管道化(Pipelining,理论优化,但浏览器支持有限)、虚拟主机(Host头)。
    • HTTP/2: 性能优化:二进制分帧、多路复用(一个连接并行传输多个请求/响应)、头部压缩(HPACK)、服务器推送(爬虫通常不利用)。爬虫需注意: 越来越多网站使用HTTP/2。库如requests本身不支持HTTP/2(需httpx等),但底层库(如urllib3)或异步库(aiohttp, httpx)可能支持。反爬可能检测是否使用HTTP/2及指纹。
    • HTTP/3 (QUIC): 基于UDP,解决队头阻塞,更快握手。逐步普及中。爬虫支持库较少(如aioquic, httpx实验性支持)。未来需关注。

2. DNS (Domain Name System) - 域名到IP的翻译官

  • 核心作用: 将人类可读的域名(如www.example.com)解析为机器可读的IP地址(如93.184.216.34)。
  • 爬虫流程:
    1. 爬虫程序给出目标URL(包含域名)。
    2. 操作系统(或爬虫程序本身)调用解析器 (Resolver)
    3. 解析器查询本地DNS缓存 -> 若未命中,查询配置的DNS服务器(递归解析器) -> 递归服务器可能查询根DNS服务器 -> 顶级域服务器 (TLD, 如.com) -> 权威DNS服务器 (目标域名所属) 获取最终IP。
    4. 获取IP地址。
    5. 爬虫程序使用该IP地址建立TCP连接(通常是HTTP/HTTPS)。
  • 爬虫关注点:
    • 解析延迟: DNS解析会增加请求延迟。优化:
      • 使用本地缓存(操作系统或爬虫框架内部)。
      • 使用可靠的公共DNS(如8.8.8.8, 1.1.1.1)或自建DNS缓存服务器。
      • 异步爬虫中,DNS解析通常是阻塞点,需使用支持异步DNS解析的库(如aiohttp配合aiodns)。
    • DNS负载均衡/CDN: 大型网站通过DNS返回不同IP(根据用户地理位置、负载情况)实现负载均衡或CDN加速。爬虫可能解析到不同的IP,需确保能正确处理。
    • DNS污染/劫持: 某些环境下DNS可能被篡改。爬虫需使用可信DNS或VPN/代理。
    • Hosts文件: 可本地修改hosts文件强制域名映射到特定IP(用于测试或绕过某些DNS问题)。

3. 其他可能相关的协议(按需)

  • WebSocket: 全双工通信协议,建立在单个TCP连接上。用于需要服务器主动推送数据的场景(如实时聊天、股票行情、游戏)。爬虫应用: 抓取高度动态、实时更新的数据时,可能需要模拟WebSocket握手(HTTP Upgrade)和消息交换。库如websockets (Python)。
  • FTP (File Transfer Protocol): 文件传输。爬虫应用: 专门抓取FTP服务器上的文件时使用。库如ftplib (Python)。注意匿名登录和认证。
  • SMTP/POP3/IMAP: 邮件协议。爬虫应用较少, 主要用于邮件监控或自动化,而非通用网页爬取。
  • RESTful API / GraphQL: 严格来说不是独立协议,而是构建在HTTP之上的架构风格查询语言。现代网站大量使用API提供数据(尤其是前端渲染SPA应用)。爬虫关键: 分析网站XHR/Fetch请求,直接调用其后台API获取结构化数据(通常是JSON),比解析HTML更高效、更稳定。需要理解API端点(Endpoint)、参数(Params)、认证方式(API Key, Token, OAuth)。

三、 应用层与爬虫反爬对抗的核心战场

  1. 请求头 (Headers) 伪装:

    • 设置合理的User-Agent (模拟主流浏览器)。
    • 携带必要的Referer
    • 设置Accept*系列头,模拟浏览器。
    • 管理好CookieSession
    • 有些反爬会检查是否存在特定Header(如X-Requested-With)或其值。需分析目标网站正常浏览器的请求头进行复制。
  2. 频率控制与IP代理:

    • 应用层状态码429 Too Many Requests是明确的速率限制信号。
    • 爬虫必须控制请求速率time.sleep(), 限速器)。
    • 使用IP代理池是应对基于IP限制的主要手段(轮换IP)。代理类型:HTTP(S), SOCKS4/5。需注意代理质量、匿名度(透明/匿名/高匿)、稳定性和速度。
  3. 动态内容与渲染:

    • 现代网站大量使用JavaScript动态生成内容(前端渲染 - SPA)。
    • 单纯HTTP请求获取的初始HTML可能不包含关键数据。
    • 解决方案:
      • 分析XHR/Fetch API请求: 找到数据源API直接调用(最优解)。
      • 使用无头浏览器 (Headless Browser): Selenium, Playwright, Puppeteer。能执行JS,渲染完整DOM,模拟用户操作。代价是资源消耗大、速度慢。需配合浏览器指纹管理(undetected-chromedriver)。
      • JS逆向工程: 分析混淆的JS代码,找到生成关键参数(如Token, Signature)的算法,在爬虫中复现(难度高,维护成本高)。
  4. 验证码 (CAPTCHA):

    • 明确的反爬手段(区分人机)。
    • 应对策略(按难度/成本):
      • 避免触发: 控制好频率和模式,模拟人类行为。
      • 人工打码: 遇到时暂停,人工输入(小规模)。
      • 第三方打码平台: 调用API付费识别(成本考虑)。
      • OCR库识别简单验证码: Tesseract等(效果有限)。
      • 深度学习模型识别: 需要大量标注数据和模型训练(专业性强)。
      • 绕过: 研究特定验证码漏洞(罕见且不道德)。
  5. TLS/HTTP指纹:

    • 高级反爬通过分析TCP握手特征(如TLS支持的加密套件顺序、扩展)或HTTP/2的帧序等生成客户端指纹。
    • 普通爬虫库的指纹与真实浏览器(特别是特定版本)不同。
    • 对抗: 使用能模拟浏览器底层网络栈的库(如Python的curl_cffi, tls_client;或直接使用无头浏览器)。
  6. 用户行为模拟:

    • 反爬系统会分析请求序列(点击流、鼠标移动、滚动、停留时间等)。
    • 对抗: 在无头浏览器中引入随机延迟、模拟鼠标移动和点击(Playwright, Puppeteer提供API)。
  7. 数据加密/混淆:

    • 关键数据在响应中加密或混淆(如字体反爬)。
    • 对抗: JS逆向分析解密算法,或OCR识别(针对字体反爬)。

四、 爬虫开发最佳实践(应用层相关)

  1. 遵守robots.txt 尊重网站的爬取规则(虽非强制,但体现道德和法律风险意识)。使用robotparser模块解析。
  2. 错误处理与重试: 健壮的爬虫必须处理网络错误(超时、连接断开)、HTTP错误状态码(特别是4xx, 5xx, 429)和解析错误。实现带退避策略的重试机制。
  3. 连接池管理: 复用HTTP(S)连接(库通常自动处理)。异步爬虫高效利用连接。
  4. 超时设置: 为连接、读取设置合理超时,避免无限等待。
  5. 数据解析: 根据Content-Type选择合适的解析器(HTML->BeautifulSoup/lxml, JSON->json, XML->lxml/xml.etree)。注意编码问题(charset in Headers/HTML meta tag)。
  6. 会话管理: 使用Session对象(如requests.Session())自动管理Cookie和连接复用。
  7. 代理管理: 实现代理池的获取、验证、轮换和失效剔除机制。
  8. 遵守法律法规与网站条款: 了解目标网站的服务条款和当地关于数据抓取的法律法规(如GDPR, CCPA),避免抓取敏感或个人隐私信息。责任自负!

五、 工具与库 (Python 示例为主)

  • HTTP客户端: requests (同步,简单易用), aiohttp (异步,高效), httpx (同步/异步,支持HTTP/2), urllib3 (底层库)。
  • HTML/XML解析: BeautifulSoup4 (友好), lxml (C编写,速度极快), pyquery (jQuery风格)。
  • 无头浏览器/自动化: Selenium (老牌), Playwright (微软,强大,跨浏览器), Puppeteer (Node.js, Chrome官方)。
  • WebSocket: websockets
  • FTP: ftplib
  • 代理管理: 自行管理IP池或使用代理服务商SDK。
  • 异步DNS: aiodns (配合aiohttp)。
  • 反反爬/指纹模拟: curl_cffi (模拟cURL指纹), undetected-chromedriver (防检测的Selenium), tls_client
  • 框架: Scrapy (强大、可扩展的异步爬虫框架),PySpider

文章标题:计网应用层

文章作者:io-wy

文章链接:https://io-wy.github.io/posts/%E5%BA%94%E7%94%A8%E5%B1%82[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。