【问题标题】:AgilityPack - Maintaining a 'connection' for several HTTP RequestsAgilityPack - 为多个 HTTP 请求维护“连接”
【发布时间】:2019-08-04 00:07:05
【问题描述】:

我有一个系统需要多次调用 API 作为单个“作业”。 我通过主机名连接到代理来执行这项工作,因此它不会为我分配我可以看到的 IP 地址。我基本上把任务交给了。

目前我正在使用 HtmlWeb 来调用我的 URL 列表,如下所示:

var webProxy = new WebProxy(Address: [MyProxyHost]);

var web = new HtmlWeb();
web.UseCookies = false;
web.UserAgent = "[MyUserAgent]";
var htmlDoc = web.Load("[URL]","GET", webProxy, webCreds);
//...do stuff with results...

问题:就目前而言,我发出的每个请求都会轮换代理(因为使用代理主机的每个“调用”都会随机更改他们一方的 IP - 我无法控制这一点)。

我想要做的是在多个调用中重复使用 http 请求/连接(我很感激我可能无法为此使用 HtmlWeb)。

所以我基本上会说:

  • 创建 HTTP 请求对象(带代理主机)
  • 打开/初始化
  • 提出请求 1
  • ...
  • 发出请求 N
  • 关闭并丢弃

这可能吗?

【问题讨论】:

  • .. 使用 HttpClient 下载 HTML?
  • 我现在正在看这个。我在多个呼叫中使用WebProxyHttpClientHandler 作为HttpClient。我会更新我的进展情况

标签: c# asp.net-core html-agility-pack


【解决方案1】:

好的,我已经准备好了以下内容,到目前为止似乎没问题:

var webProxy = new WebProxy()
{
    Address = new Uri([ServerHost] + ":" + [ServerPort]),
    BypassProxyOnLocal = false,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(
        userName: [Username],
        password: [Password])
};

var httpClientHandler = new HttpClientHandler()
{
    Proxy = webProxy,
};

var _httpClient = new HttpClient(httpClientHandler);
...
var response = await _httpClient.GetAsync([Url]);
var pageContents = await response.Content.ReadAsStringAsync();

var htmlDoc.LoadHtml(pageContents);
...

这会使用代理向每个 URL 发出请求,并将返回的页面转换为 HtmlDocument,这样我就可以执行所需的 AgilityPack 内容了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2016-02-28
    • 1970-01-01
    • 2012-02-06
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多