【发布时间】: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