完成加载后,从网站获取HTML代码

时间:2018-12-22 19:10:14

标签: c# web-scraping dotnet-httpclient

我正在尝试使用以下代码从特定网站异步获取HTML代码:

var response = await httpClient.GetStringAsync("url");

但是问题是该网站通常需要一秒钟的时间来加载网站的其他部分。我需要什么,所以问题是我是否可以先加载该网站并在一定时间后阅读内容。

很抱歉,这个问题是否已经得到回答,但我真的不知道要搜索什么。

谢谢, 二十


编辑#1

如果您想自己尝试使用,URL为http://iloveradio.de/iloveradio/,则需要不立即加载的标题和艺术家。

5 个答案:

答案 0 :(得分:11)

您的方向错误。所引用的站点具有返回json的播放列表api。您可以从获取信息:

http://iloveradio.de/typo3conf/ext/ep_channel/Scripts/playlist.php

编辑:Chome检查器用于查找播放列表链接

enter image description here

答案 1 :(得分:4)

您可以使用Puppeteer-Sharp

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false }))
using (var page = await browser.NewPageAsync())
{
    await page.SetViewportAsync(new ViewPortOptions() { Width = 1280, Height = 600 });
    await page.GoToAsync("http://iloveradio.de/iloveradio/");
    await page.WaitForSelectorAsync("#artisttitle DIV");
    var artist = await page.EvaluateExpressionAsync<string>("$('#artisttitle DIV')[0].innerText");
    Console.WriteLine(artist);
    Console.ReadLine();
}

答案 2 :(得分:3)

如果之后加载了某些内容,则意味着它们是在页面加载后由javascript代码生成的(例如ajax请求),因此无论您等待多长时间,它都不会具有您想要的内容(因为它们在加载时不在源代码中。

简便的方法:

使用WebBrowser,当DocumentCompleated事件触发时,要等到所需的元素出现为止。

正确的方法:

自己找到JavaScript并自行触发(说起来容易,很难做到)。

答案 3 :(得分:3)

这里要理解的是,当您从URL读取响应时,您将得到的只是原始响应,在这种情况下,服务器将回复HTML的源代码。

与您在浏览器的DOM Inspector开发人员工具中看到的内容不同,您只会从页面中获取原始HTML源(在“ Page Source”开发人员工具中可能看到的内容),而不会包含任何动态创建的内容( JavaScript)或已加载的内容(如iframe)。

因此您无法在DOM Inspector中看到您所看到的内容:

enter image description here

您将在Page Source(在Chrome中查看>开发人员> View Source)中看到以下内容:

enter image description here

您不能等待其他内容加载,因为由于HTML内容没有像浏览器那样被解析或呈现,因此它永远也不会加载。

不过,您有几个可用选项:

  • 查看网站是否具有可以使用的API
  • 确定所需内容的实际加载位置,并对该内容进行另一个/不同的HTTP请求(“网络面板”在此处很有帮助)
  • 使用无头浏览器以编程方式加载页面并动态读取页面内容(这会增加很多的开销,如果可能应避免使用)

答案 4 :(得分:0)

我已经检查了网站,数据是通过javascript加载的。您只能使用httpClient.GetStringAsync("url");获取html。 据我所知,要获得由浏览器操纵的元素是没有运气的。