Asp.net mvc asp.net mvc应用程序中的Web浏览器托管问题
在我的Asp.NETMVCWeb应用程序中,我必须通过网站从网站获取数据。对于抓取数据,我需要登录到站点,然后通过单击菜单选项卡到达站点,然后从该页面抓取数据。被刮去的站点包含2个框架。我以前在我的一个windows项目中通过windows web浏览器控件实现了web抓取 我遵循以下步骤将web浏览器控件集成到我的web应用程序中。在VisualStudio环境下,一切都很好,我通过web浏览器从网站抓取数据。但是,当我尝试托管应用程序时,它没有按预期工作。无法加载web浏览器控件。我寻找解决办法,但还没有找到可行的办法。我曾尝试通过iframe、Silverlight Webbrowser控件和javascript激活登录事件来实现相同的功能,但由于跨域问题导致访问被拒绝,因此也失败了 那么,有没有办法通过在asp.net web应用程序中登录到该站点来刮取数据呢。我可以将我的windows应用程序设置为ActiveX控件并使用它吗。ActiveX是否存在跨浏览器问题 任何帮助都将不胜感激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浏览器控件。我寻找解决
提前感谢正如评论中所建议的,使用web浏览器的方法似乎很繁重,并且会受到其他环境限制。您最好的方法是创建一个单独的、可测试的存储库来刮取数据——如果您确实需要(并且目标数据不变),可以按需刮取,也可以提前使用spider方法 是的,如果您尝试将其设置为ActiveX,不同的浏览器都会遇到问题。安全可能不允许这样做。这里有很多因素,;如果您的环境不受控制,这不是一个好的选择 假设您采用按需方式,我强烈建议您创建一个可以引用的Web服务或类。然后,您可以在服务器端使用开源解析器,例如:
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;
}