【问题标题】:Scraping an IE Window抓取一个 IE 窗口
【发布时间】:2012-08-04 10:58:13
【问题描述】:

我正在开发与两个系统交互以加载/存储数据的系统。

  1. 一个古老的终端程序,它使用第 3 方 DLL 来桥接 .NET 和这个 系统,发送击键并接收它们。这部分没有 问题,因为技术很清楚。

  2. 一个 128 位 SSL 网络应用程序,从网站在其自己的窗口中启动。它没有在任何类型的 Java 中运行,只是 HTML 和一点 JavaScript。

    我想以某种方式抓取此窗口的内容,以便可以访问其中的可用文档。至少,这将等待用户导航到正确的页面,然后单击我编写的应用程序中的按钮,然后查找正确的窗口,解析当前页面的源并下载文件.

    在理想情况下,它会从一开始就实现自动化,用户只需在我的应用中单击一下即可导航到正确的页面、登录并下载文档。

#2 在任何程度上都可行,使用商业的免费组件。

【问题讨论】:

  • 您是否看过使用WebClient 检索 HTML/JS 并使用 HTML Agility Pack 解析它?当然,通过使用 fiddler 查看流量来找出要发出的请求。

标签: c# .net interface screen-scraping web-scraping


【解决方案1】:

您想要的很难实现,如果您不针对特定的浏览器供应商,如 FF 或 Chrome 等,则更是如此。

建议:

1) 使用System.Net.WebClient 直接从网络服务器下载源代码。

2) 如果您需要一些自动化代码无法(或您不想)模拟的用户交互,您可以使用 webkitdotnet 之类的项目,然后您可以创建一个内置浏览器的 WinForm 应用程序。您将拥有对该浏览器内容的完全访问权限。

Webkitdotnet 项目页面:http://sourceforge.net/projects/webkitdotnet/

【讨论】:

  • 窗口总是在 IE 中启动,因为这是用户使用的。我想附加到现有的 IE 窗口。
【解决方案2】:

如果浏览器Internet Explorer(我正在阅读问题标题),只需引用这个Microsoft Internet ControlsCOM库:

然后我做了这样的抓取:

var internetExplorerShells = new SHDocVw.ShellWindows();

string html = null;
foreach (SHDocVw.InternetExplorer ie in internetExplorerShells)
{
    if (ie.Document != null)
    {
        var url = ie.LocationURL;

        // If the Internet Explorer Address contains _configuration.ScrapingUrl
        if (CultureInfo.InvariantCulture.CompareInfo.IndexOf(
            url,
            _configuration.ScrapingUrl,
            CompareOptions.IgnoreCase) >= 0)
        {
            html = ie.Document.Body.OuterHtml;
            if (html != null)
                break;
        }
    }
}

然后只需通过 NuGet 安装 HTMLAgilityPack 并开始抓取 html:

var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);

【讨论】:

  • 被接受为彻底的答案,尽管我不记得 8 年前当我问这个问题时我想做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多