【问题标题】:How to fetch Text Block from dynamic SSL page via c# only如何仅通过 c# 从动态 SSL 页面获取文本块
【发布时间】:2019-08-21 22:31:05
【问题描述】:

在我的 C# 代码中,我只想使用服务器端代码在此处获取页面内容:

https://1962ordo.today

问题是,动态部分是在页面加载时附加的,所以今天看起来像这样,但明天看起来会有所不同。

https://1962ordo.today/day/sts-cosmas-and-damian-2-2-4/

我只想获取 container 标记的文本,而不是其他任何内容,但想保留 <br> 标记。

我尝试使用streamreader with SSL capabilities,但它似乎无法正常工作。

最后,我需要一个可以加载到页面中的简单 html 字符串。

到目前为止,这就是我想出的;它尝试加载内容,但一直在尝试加载并且永远不会解析(我在 asp.net page_load 部分中有它):

protected void Page_Load(object sender, EventArgs e) {

    string ordourl;
    ordourl = "https://1962ordo.today";

    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

    using (WebClient webClient = new WebClient()) {
        webClient.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)";
        webClient.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        webClient.Headers["Accept-Language"] = "en-us,en;q=0.5";
        webClient.Headers["Accept-Encoding"] = "gzip,deflate";
        webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        StreamReader sr = new StreamReader(webClient.OpenRead(ordourl));
        string results = sr.ReadToEnd();
        div_ordo.InnerHtml = results;
    };

}

如果我使用InnerText 而不是InnerHtml,它会加载到页面的<div> 底层html 中,但其中没有一个是当天的实际数据。 Streamreader 没有获取实际页面最终加载结果的数据。它只是获取实际页面的 html。我需要代码等待数据库信息加载到该页面并显示最终结果,而不是初始页面。

我试过了,它做的完全一样:

    protected void Page_Load(object sender, EventArgs e) {


        string ordourl;
        ordourl = "https://1962ordo.today";
        string ordotext;
        ordotext = "";

        ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

        WebRequest request = WebRequest.Create(ordourl);
        WebResponse response = request.GetResponse();
        using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
            ordotext = reader.ReadToEnd();
            div_ordo.InnerText = ordotext;
            reader.Close();

            }
        response.Close();
}

【问题讨论】:

  • Strip() 方法中发生了什么?我测试了你的代码,它没有挂起,但我不知道 Strip() 方法逻辑在做什么。
  • 哦,那个...实际上,这是不小心发布的。我试图剥离一些 html 并仅显示获取的文本。我将从我发布的代码中删除它。你说你的工作?我的只是不断尝试加载和加载,页面不断闪烁,没有出现任何文本 - 只是图像。似乎它不会等待数据加载 - 我认为我必须使用调试器。
  • 您发布的代码对我来说很好用。您确定您的客户端实际上正在连接到服务器并且没有挂断尝试启动连接吗?您可以使用 Fiddler 之类的工具来查看流量和响应,以确定您是否确实在建立连接。
  • 因为您尝试从网页中执行此操作.. .检查一下...stackoverflow.com/questions/302775/…
  • 实际上,我已经成功了。我想出了一个 url 参数并且可以指定一个日期。如果我这样做,它会完美加载。现在我只需要过滤出正确的 html 部分来显示。

标签: c# asp.net screen-scraping


【解决方案1】:

现在,我认为 webclient 无法处理页面加载本身,但我想出了如何通过 url 参数加载当前日期,现在它可以完美运行。只需获取今天的日期并自定义格式并将其添加到查询字符串中即可。

        string ordohtml = "Ordo here...";
        string ordotext = "";

        string ordodate;
        DateTime dt = new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day);
        ordodate = DateTime.Now.ToString("yyyyMMd");

        string ordourl = "https://1962ordo.today?date=" + ordodate;

        ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
        using (WebClient webClient = new WebClient()) {
            webClient.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)";
            webClient.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            webClient.Headers["Accept-Language"] = "en-us,en;q=0.5";
            webClient.Headers["Accept-Encoding"] = "gzip,deflate";
            webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
            StreamReader sr = new StreamReader(webClient.OpenRead(ordourl));
            ordohtml = sr.ReadToEnd();
            div_ordo = ordohtml.InnerHtml;

        };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2016-12-28
    • 2022-11-23
    • 1970-01-01
    • 2012-03-14
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多