Asp.net mvc asp.net mvc应用程序中的Web浏览器托管问题

Asp.net mvc asp.net mvc应用程序中的Web浏览器托管问题,asp.net-mvc,web-scraping,Asp.net Mvc,Web Scraping,在我的Asp.NETMVCWeb应用程序中,我必须通过网站从网站获取数据。对于抓取数据,我需要登录到站点,然后通过单击菜单选项卡到达站点,然后从该页面抓取数据。被刮去的站点包含2个框架。我以前在我的一个windows项目中通过windows web浏览器控件实现了web抓取 我遵循以下步骤将web浏览器控件集成到我的web应用程序中。在VisualStudio环境下,一切都很好,我通过web浏览器从网站抓取数据。但是,当我尝试托管应用程序时,它没有按预期工作。无法加载web浏览器控件。我寻找解决

在我的Asp.NETMVCWeb应用程序中,我必须通过网站从网站获取数据。对于抓取数据,我需要登录到站点,然后通过单击菜单选项卡到达站点,然后从该页面抓取数据。被刮去的站点包含2个框架。我以前在我的一个windows项目中通过windows web浏览器控件实现了web抓取

我遵循以下步骤将web浏览器控件集成到我的web应用程序中。在VisualStudio环境下,一切都很好,我通过web浏览器从网站抓取数据。但是,当我尝试托管应用程序时,它没有按预期工作。无法加载web浏览器控件。我寻找解决办法,但还没有找到可行的办法。我曾尝试通过iframe、Silverlight Webbrowser控件和javascript激活登录事件来实现相同的功能,但由于跨域问题导致访问被拒绝,因此也失败了

那么,有没有办法通过在asp.net web应用程序中登录到该站点来刮取数据呢。我可以将我的windows应用程序设置为ActiveX控件并使用它吗。ActiveX是否存在跨浏览器问题

任何帮助都将不胜感激


提前感谢

正如评论中所建议的,使用web浏览器的方法似乎很繁重,并且会受到其他环境限制。您最好的方法是创建一个单独的、可测试的存储库来刮取数据——如果您确实需要(并且目标数据不变),可以按需刮取,也可以提前使用spider方法

是的,如果您尝试将其设置为ActiveX,不同的浏览器都会遇到问题。安全可能不允许这样做。这里有很多因素,;如果您的环境不受控制,这不是一个好的选择

假设您采用按需方式,我强烈建议您创建一个可以引用的Web服务或类。然后,您可以在服务器端使用开源解析器,例如:

  • 如果文档格式不正确,或者
  • 如果您可以信任文档的完整性
  • 基本上,您需要进行身份验证,存储身份验证cookie,并最终通过使用身份验证cookie填充的第二个请求加载目标文档。将该页面输入解析器(CsQuery或Fizzler)

    执行登录的示例如下:

    private HttpWebRequest PerformLoginRequest(CookieContainer container)
    {
        var request = (HttpWebRequest) WebRequest.Create(YOUR_POST_URL);
        request.Method = "POST";
        request.CookieContainer = container;
    
        _logger.DebugFormat("Attempting login for '{0}'", _username);
        var encoding = new ASCIIEncoding();
    
        // assumes the un/pw is stored in a field
        var credentials = string.Format("username={0}&password={1}", _username, _password);
        byte[] data = encoding.GetBytes(credentials);
    
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;
    
        using (var requestStream = request.GetRequestStream())
        {
            try
            {
                requestStream.Write(data, 0, data.Length);
            }
            catch (Exception e)
            {
                _logger.Error("Error in login attempt.", e);
            }
            finally
            {
                requestStream.Close();
            }
        }
        return request;
    }
    
    返回的cookies容器将有一组cookie,您需要对其进行解析,以便后续请求正确显示身份验证位。我必须这样做,并且使用了我在这里找到的代码,但是现在找不到引用。它可能看起来像这样(解释如下):

    要加载文档以对其进行解析,您可以执行以下操作:

    public string GetValueFromSomePage(int first, string second)
    {
        var container = new CookieContainer();
    
        // do login
        var request = PerformLoginRequest(container);
    
        // chew on cookies
        container = ProcessCookieContainer(request, container);
    
        var result = string.Empty;
        var requestUrl = string.Format("http://YourUrlWithParams.com/?first={0}&second={1}", 123, "abc");
        var request = (HttpWebRequest)WebRequest.Create(requestUrl);
        request.CookieContainer = container;
    
        using (var serverResponse = (HttpWebResponse)request.GetResponse())
        {
            try
            {
                var reader = new StreamReader(serverResponse.GetResponseStream());
                var responseDoc = new CQ(reader);
    
                // do something with CSS selectors...
                result = responseDoc["input[name=name]"].FirstElement().Value;
    
            }
            catch (Exception e)
            {
                _logger.Error("Error fetching data.", e);
            }
            finally
            {
                serverResponse.Close();
            }
        }
    
        return result;
    }
    
    我希望这有帮助。这里有一些活动部分,但考虑到任务的性质,您可能已经预料到了这一点


    干杯。

    您是否考虑过使用
    System.Net.Http.HttpClient
    System.Net.WebRequest
    获取所需内容?是的,我尝试过使用相同的方法,但失败了。我怀疑是因为要报废的站点包含多个框架?是否有可能只制作一个单独的应用程序来处理报废?然后将结果保存在数据库或文本文件中,您的网站可以从中读取。我猜Windows Server的安全限制正在阻止IIS启动浏览器,或阻止浏览器正常运行。您如何判断浏览器控件未加载?您不需要浏览器控件来执行刮削。使用System.Net.WebRequest。当您获得框架页面时,解析它以获得每个框架的URL。然后得到你感兴趣的框架。或者,如果URL已知,则直接转到该框架。
    public string GetValueFromSomePage(int first, string second)
    {
        var container = new CookieContainer();
    
        // do login
        var request = PerformLoginRequest(container);
    
        // chew on cookies
        container = ProcessCookieContainer(request, container);
    
        var result = string.Empty;
        var requestUrl = string.Format("http://YourUrlWithParams.com/?first={0}&second={1}", 123, "abc");
        var request = (HttpWebRequest)WebRequest.Create(requestUrl);
        request.CookieContainer = container;
    
        using (var serverResponse = (HttpWebResponse)request.GetResponse())
        {
            try
            {
                var reader = new StreamReader(serverResponse.GetResponseStream());
                var responseDoc = new CQ(reader);
    
                // do something with CSS selectors...
                result = responseDoc["input[name=name]"].FirstElement().Value;
    
            }
            catch (Exception e)
            {
                _logger.Error("Error fetching data.", e);
            }
            finally
            {
                serverResponse.Close();
            }
        }
    
        return result;
    }