【问题标题】:Get HTML Code from a website after it completed loading完成加载后从网站获取 HTML 代码
【发布时间】:2018-12-22 19:10:14
【问题描述】:

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

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

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

对不起,如果这个问题已经得到回答,但我真的不知道要搜索什么。

谢谢, 二十


编辑#1

如果您想自己尝试,网址是http://iloveradio.de/iloveradio/,我需要不会立即加载的标题和艺术家。

【问题讨论】:

    标签: c# web-scraping dotnet-httpclient


    【解决方案1】:

    你走错方向了。引用的站点具有返回 json 的播放列表 api。您可以从以下位置获取信息:

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

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

    【讨论】:

    • 非常感谢你拯救了我的一天,你是怎么找到那个的?
    • 如果这个答案有用,请考虑打勾作为答案。谢谢
    • 你是怎么发现的?
    • 请再次检查我的答案
    【解决方案2】:

    你可以使用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();
    }
    

    【讨论】:

      【解决方案3】:

      如果有东西在加载之后,说明它们是在页面加载后由javascript代码生成的(比如ajax请求),所以不管你等多久,它都不会有你想要的内容(因为加载时它们不在源代码中)。

      简单的方法:

      使用WebBrowser 并在DocumentCompleated 事件触发时等到您想要的元素出现。

      正确的方法:

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

      【讨论】:

        【解决方案4】:

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

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

        所以你没有得到你在 DOM Inspector 中看到的内容:

        您将在页面源代码中看到您在此处看到的内容(在 Chrome 中查看 > 开发人员 > 查看源代码):

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

        不过,您有多种选择:

        • 查看网站是否有您可以使用的 API
        • 确定您想要的内容实际从哪里加载,然后对该内容发出另一个/不同的 HTTP 请求(网络面板在这里很有帮助)
        • 使用无头浏览器以编程方式加载页面并动态读取页面内容(这会增加大量开销,应尽可能避免)

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2021-12-05
            • 2014-08-16
            • 2020-01-22
            • 1970-01-01
            • 1970-01-01
            • 2019-01-14
            • 2019-09-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多