使用 HtmlAgilityPack c# 从网页中抓取数据

Scrape data from web page with HtmlAgilityPack c#

我在从网页抓取数据时遇到问题,我得到了解决方案

我的问题是他们更改了现在 https://webportal.thpa.gr/ctreport/container/track 的网页,我认为它没有使用 iFrame,我无法取回任何数据。

谁能告诉我是否可以使用相同的方法从此网页获取数据,还是应该使用不同的方法?

我不知道@coder_b 是如何发现我应该使用 https://portal.thpa.gr/fnet5/track/index.php 作为网页并且我应该使用

 var reqUrlContent =
         hc.PostAsync(url,
        new StringContent($"d=1&containerCode={reference}&go=1", Encoding.UTF8,
        "application/x-www-form-urlencoded"))
        .Result;

传递变量

编辑:当我查看网页时,有一个包含数字的输入

input type="text" id="report_container_containerno" name="report_container[containerno]" required="required" class="form-control" minlength="11" maxlength="11" placeholder="E/K για αναζήτηση" value="ARKU2215462" Can I use something to pass with HtmlAgilityPack and then it should be easy to read the result

此外,当我检查 DocumentNode 时,它​​似乎向我显示了我应该同意的 cookies 页面。 我可以绕过或自动允许 cookie 吗?

试试这个:

public static string Download(string search)
{
    var request = (HttpWebRequest)WebRequest.Create("https://webportal.thpa.gr/ctreport/container/track");

    var postData = string.Format("report_container%5Bcontainerno%5D={0}&report_container%5Bsearch%5D=", search);
    var data = Encoding.ASCII.GetBytes(postData);

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;

    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }

    using (var response = (HttpWebResponse)request.GetResponse())
    using (var stream = new StreamReader(response.GetResponseStream()))
    {
        return stream.ReadToEnd();
    }
}

用法:

var html = Download("ARKU2215462");

更新

要找到要使用的 post 参数,请在浏览器中按 F12 以显示开发工具,然后选择 select 网络选项卡。现在,用您的 ARKU2215462 填写搜索输入并按下按钮。

即向服务器发出请求以获得响应。在该请求中,您可以检查请求和响应。有很多请求(样式、脚本、iamges...),但您想要 html 页面。在这种情况下,看这个:

这是请求的表单数据。如果你点击“查看源代码”,你会得到编码为“report_container%5Bcontainerno%5D=ARKU2215462&report_container%5Bsearch%5D=”的数据,正如你在代码中所需要的。