【问题标题】:Prevent alert message while scraping在抓取时防止警报消息
【发布时间】:2013-05-30 04:57:29
【问题描述】:

根据要求,我需要抓取网页中的内容。为了实现这一点,我创建了一个 Windows 应用程序并在主窗体中添加了一个 Web 浏览器控件。这样我就可以查看报废过程。我能够登录网页并导航到所需的网页。我还可以以编程方式双击网格单元。但是当前的问题是,当我以编程方式双击网格单元格并且所需的数据不可用时,我会收到一条警报消息

因此,抓取过程自然会中断,我们需要手动单击“确定”按钮以继续抓取过程。 如何避免在抓取时收到警报消息?

【问题讨论】:

  • 我已经使用过警报重载。但不幸的是它不起作用
  • 所以它可能来自某种插件?或者是 javascript 错误,在这种情况下,您可以使用 webBrowser.ScriptErrorsSuppressed = true 禁用它们。另一个问题是,你真的需要 Web 浏览器控制来进行报废吗,因为这种方法比手动执行请求要慢得多?
  • 是的,我需要 Web 浏览器控制来进行报废,因为他们想查看报废过程

标签: c# winforms web-scraping


【解决方案1】:

要以编程方式单击警报框,我们可以使用 Windows API FindWindow、FindWindowEx 和 SendMessage,其想法是当警报框出现时,承载 WebBrowser 控件的表单将失去焦点,此时,我们将能够使用FindWindow 获取警报框的窗口句柄,最后我们可以发送一个点击消息给“确定”按钮来点击它。

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    private void Form1_Deactivate(object sender, EventArgs e)
    {
        IntPtr hwnd = FindWindow(null, "Message from webpage");
        hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
        uint message = 0xf5;
        SendMessage(hwnd, message, IntPtr.Zero, IntPtr.Zero);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2018-08-11
    • 1970-01-01
    • 2012-04-03
    • 2020-10-09
    相关资源
    最近更新 更多