Bon*_*viD 6 asp.net-mvc web-scraping
在我的Asp.Net MVC Web应用程序中,我必须通过网站从站点获取数据.对于报废数据,我需要登录该站点,然后通过单击菜单选项卡访问站点,然后从该页面我需要废弃数据.报废的网站包含2个框架.我之前通过Windows Web浏览器控件在我的一个Windows项目中实现了Web报废.
我按照以下链接将Web浏览器控件集成到我的Web应用程序中.在视觉工作室环境下一切正常,我通过网络浏览器从网站上删除我的数据.但是当我尝试托管应用程序时,它没有按预期工作.Web浏览器控件未加载.我搜索了解决方案,但还没有得到可行的解决方案.我试图通过iframe实现相同的功能,并使用Silverlight Webbrowser控件和使用javascript来实现登录事件,但由于跨域问题,它也因访问拒绝而失败.
那么有没有办法通过loggin将数据废弃到asp.net web应用程序中的站点.我可以将我的Windows应用程序作为ActiveX控件使用它.ActiveX会有跨浏览器问题吗?
任何帮助将不胜感激
提前致谢
正如评论中所建议的,使用网络浏览器的方法似乎很繁重,并且会受到其他环境限制。最好的方法是创建一个单独的、可测试的存储库来抓取数据 - 如果确实需要,可以按需或提前使用蜘蛛方法(并且目标数据不会改变)。
是的,如果您尝试将其设为 ActiveX,不同的浏览器将会出现问题。安全可能不允许。这里面的因素确实有很多;如果您的环境不受控制,这不是一个很好的选择。
假设您采用按需方法,我强烈建议创建一个您可以参考的网络服务或类。然后,您可以在服务器端使用开源解析器,例如:
基本上,您需要进行身份验证,存储您的身份验证 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;
}
Run Code Online (Sandbox Code Playgroud)
返回的 cookies 容器将有一个 set-cookie,您需要解析它,以便后续请求正确呈现身份验证位。我必须这样做,并使用了我在此处找到的代码,但现在找不到参考。它可能看起来像这样(此处的解释Set-Cookie):
private static CookieContainer ProcessCookieContainer(HttpWebRequest request, CookieContainer container)
{
var response = (HttpWebResponse) request.GetResponse();
var cookierReader = new StreamReader(response.GetResponseStream());
string htmldoc = cookierReader.ReadToEnd();
var cookieHeader = response.GetResponseHeader("Set-Cookie");
response.Close();
container = new CookieContainer();
foreach (var cookie in cookieHeader.Split(','))
{
// these are ; seperated name/value pairs
var split = cookie.Split(';');
string name = split[0].Split('=')[0];
string value = split[0].Split('=')[1];
// create the cookie with the domain
var c = new Cookie(name, value) {Domain = "YourCookieDomain.com"};
container.Add(c);
}
return container;
}
Run Code Online (Sandbox Code Playgroud)
要加载文档来解析它,您可能会执行以下操作:
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;
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。这里有一些移动部分,但鉴于您的任务性质,您可能已经预料到了这些。
干杯。
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |