5.10浏览器模拟与 Profiler

在开发爬虫程序时,目标网站可能会根据用户代理(User-Agent)或其他因素提供不同的页面版本,如 PC 端和移动端。此外,一些网站还具备反爬虫机制,能够识别并阻止爬虫程序的访问。为应对这些问题,我们可以配置请求标头以模拟真实的浏览器环境进行请求。

模拟浏览器环境(爬虫检测)#

在开发爬虫程序时,目标网站可能会根据用户代理(User-Agent)或其他因素提供不同的页面版本,如 PC 端和移动端。此外,一些网站还具备反爬虫机制,能够识别并阻止爬虫程序的访问。为应对这些问题,我们可以配置请求标头以模拟真实的浏览器环境进行请求。

HTTP 声明式请求通过 SimulateBrowserAttribute 特性来模拟浏览器环境。相应的 HTTP 声明式提取器实现为 SimulateBrowserDeclarativeExtractor 类型,该类型负责解析 SimulateBrowserAttribute 特性并构建 HttpRequestBuilder 实例所需的模拟浏览器环境配置。

cs
// 在接口定义上应用,影响所有方法[SimulateBrowser]public interface IHttpService : IHttpDeclarative{    [Get("https://furion.net/")]    Task<string> GetStringAsync();    // 在方法上应用    [SimulateBrowser(IsMobile = true)]   // 模拟移动端浏览器环境    [Get("https://furion.net/")]    Task<string> GetStringAsync();}

在添加该特性之后,HTTP 请求将在发送前自动附带以下请求标头,以确保服务器能够准确识别并处理请求:

bash
# PC 浏览器代理Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0# 移动端浏览器代理Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Mobile Safari/537.36 Edg/142.0.0.0

SimulateBrowserAttribute 包含以下构造函数和属性:

  • 构造函数

    • new():作用于方法或接口,启用模拟浏览器环境。
  • 属性

    • IsMobile:是否为移动端(bool 类型),默认值为 false(即桌面端)。

启用请求分析工具#

在现代化的浏览器中,通常内置了开发者工具,这些工具能够捕获并直观展示用户访问网站时的所有请求与响应数据。类似地,我们也为 HTTP 远程请求模块提供了一套分析工具。

HTTP 声明式请求通过 ProfilerAttribute 特性来启用请求分析工具。相应的 HTTP 声明式提取器实现为 ProfilerDeclarativeExtractor 类型,该类型负责解析 ProfilerAttribute 特性并构建 HttpRequestBuilder 实例所需的启用请求分析工具配置。

cs
// 在接口定义上应用,影响所有方法[Profiler]public interface IHttpService : IHttpDeclarative{    // 在方法上应用    [Profiler]    [Get("https://furion.net/")]    Task<string> GetStringAsync();    [Profiler(false)]   // 禁用请求分析工具    [Get("https://furion.net/")]    Task<string> GetStringAsync();}

启用后,当执行 HTTP 远程请求时,控制台将输出如下详细信息:

bash
General:    Request URL:               https://furion.net/    Request Method:            GET    Status Code:               200 OK    HTTP Version:              1.1    HTTP Content:    Content Type:    Declarative:               System.Threading.Tasks.Task<System.String> GetStringAsync() | HttpAgent.Samples.IHttpService    HttpClient Name:    Request Duration (ms):     24.00Response Headers:    Server:             nginx/1.22.1    Date:               Sun, 24 Nov 2024 16:48:50 GMT    Connection:         keep-alive    Vary:               Accept-Encoding    ETag:               "67426a3f-f366"    Cache-Control:      max-age=315360000    Accept-Ranges:      bytes    Content-Type:       text/html    Content-Length:     62310    Last-Modified:      Sat, 23 Nov 2024 23:50:23 GMT    Expires:            Thu, 31 Dec 2037 23:55:55 GMT

此外,除了为单个请求启用分析工具,还可以全局注册以在 HttpClient 中启用:

cs
// 为默认客户端启用services.AddHttpClient(string.Empty)    .AddProfilerDelegatingHandler();// 还可以提供条件禁用,例如生产环境中禁用services.AddHttpClient(string.Empty)    .AddProfilerDelegatingHandler(disableIn: () => builder.Environment.EnvironmentName == "Production");services.AddHttpClient(string.Empty)    .AddProfilerDelegatingHandler(disableInProduction: true);// 为特定客户端启用//services.AddHttpClient("weixin")//    .AddProfilerDelegatingHandler();// 还可以一键为所有客户端配置启用services.ConfigureHttpClientDefaults(clientBuilder =>    clientBuilder.AddProfilerDelegatingHandler());// 或使用 IHttpRemoteBuilder 扩展方法进行一键配置services.AddHttpRemote()    .ConfigureHttpClientDefaults(clientBuilder => clientBuilder.AddProfilerDelegatingHandler());

通过启用请求分析工具,开发者能够更直观、便捷地观察和调试 HTTP 请求,从而提升开发效率与调试准确性。

ProfilerAttribute 包含以下构造函数和属性:

  • 构造函数

    • new():作用于方法或接口,启用请求分析工具。
    • new(enabled):作用于方法或接口,设置是否启用请求分析工具。
  • 属性

    • Enabled:是否启用(bool 类型),默认值为 true(启用)。