【问题标题】:HTMLAgilityPack webscraping but the HTML response makes no senseHTMLAgilityPack 网页抓取,但 HTML 响应没有意义
【发布时间】:2022-08-19 23:14:37
【问题描述】:

所以我试图抓取一个网站的 HTML。

private static async Task GetResponseMessageAsync(string filledInUrl, List<HttpResponseMessage> responseMessages)
{
    Console.WriteLine(\"Started GetResponseMessageAsync for url \" + filledInUrl);
    var httpResponseMessage = await _httpClient.GetAsync(filledInUrl);
    await EnsureSuccessStatusCode(httpResponseMessage);
    responseMessages.Add(httpResponseMessage);
    Console.WriteLine(\"Finished GetResponseMessageAsync for url \" + filledInUrl);
}

我给的网址是这个https://www.rtlnieuws.nl/zoeken?q=philips+fraude

当我在浏览器中的该页面上单击鼠标右键 -> 检查时,我看到:

我可以使用 Xpath 搜索的普通 HTML。

但。当我实际打印出我的 ResponseMessage 包含的内容时......

    var htmlDocument = new HtmlDocument(); // this will collect all the search results for a given keyword into Nodes

    var scrapedHtml = await httpResponseMessage.Content.ReadAsStringAsync();
    Console.WriteLine(scrapedHtml); 

...看起来像这样:

这是一个不同的 HTML。基本上看起来服务器发送的 HTML 和我在浏览器中看到的 HTML 是不同的。而且我不能再使用我的 Xpath 来处理响应了。

我知道我的爬虫通常可以工作,因为当我在另一个网站上使用它时,\"server-HTML\" 和 \"browser-HTML\" 是相同的。

我想知道我现在可以做些什么来将 \"server-HTML\" 翻译成 \"browser-HTML\"?它是如何工作的? HTMLAgilityPack 中有我可以使用的东西吗?我在网上找不到任何东西,可能是因为 \"server-HTML\" 和 \"browser-HTML\" 不是正确的术语。

将感谢您的帮助。

  • 我不确定。我认为刮刀做了它应该做的。它加载 HTML 响应。这是: view-source:rtlnieuws.nl/zoeken?q=philips+fraude 。但是我想看看浏览器中解释了什么,这是rtlnieuws.nl/zoeken?q=philips+fraude,然后右键单击+检查。我认为源 HTML 或它所调用的任何内容都是在浏览器的会话期间解释的,但我不确定如何模仿它。
  • 该页面使用 JavaScript 动态生成其客户端标记,这意味着当您在浏览器中下载标记时,您需要一个成熟的渲染引擎来获取标记。 HttpClient 不会削减它,你需要像 Selenium 和/或 WebView2 这样的东西。
  • 是的,我有一种感觉是关于渲染 js。所以 HTMLAgilityPack 没有任何功能吗? :( 干扰器。
  • 如果您想观察@JeroenMostert 提到的内容,可以尝试在浏览器中禁用 javascript 并浏览引用的页面。查看它是否具有与HttpClient 响应相同的元素。如果不是,那么您的请求可能会被识别为机器人。您需要安排您的请求,使其看起来像一个实际的浏览器请求。 (这里的标题很重要)如果相同,则需要使用 Selenium、Puppeteer Playwright 等其他东西。
  • HTMLAgilityPack 解析 HTML,这就是它所做的一切(尽管它做得很好)。如何获取该 HTML 的问题是一个单独的问题,而不是 HAP 关心的问题。

标签: c# web-scraping html-agility-pack


【解决方案1】:

我认为您不需要 HtmlAgilityPack,因为您的查询结果也以 json 格式提供:

https://dsapi.freemium.diw.rtlwecloudservices.nl/v1/rtlnieuws/search?query=philips%20fraude&context=http://www.rtlnieuws.nl/&skip=0&domain=rtlnieuws

为了了解如何将字符串转换为 json 类,我写了这个答案: How to convert JSON text into objects using C#

所以你需要一个 webrequest 来获取 json 作为一个字符串。接下来,您必须将该字符串序列化为对象集合。

另请参阅此答案: https://stackoverflow.com/a/53203412/4180382

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多