首先,请原谅我在这个问题上的天真。我是一个退休的程序员,在DOS出现之前就开始了。我不是ASP.NET方面的专家,我需要知道的部分就是我需要知道的。(如果你跟着我...)
因此,我想登录一个网站,并抓取一些内容。在使用记事本和fiddler2查看了HTML源之后,我清楚地发现该站点是使用ASP.NET技术实现的。
一开始,我做了大量的谷歌搜索,并阅读了我能找到的所有关于用c#编写屏幕抓取器的信息。经过一些调查和多次尝试,我想我得出的结论是,这并不容易。
问题的症结(正如我现在所看到的)是ASP为程序员提供了很多维护状态的方法。Cookie、视图状态、会话变量、页面变量、get和post参数等。另外,程序员可以在服务器和客户端脚本之间分配工作。富web客户端,如IE、Safari、Chrome或Firefox,知道如何处理程序员编写的任何内容( ASP框架在幕后实现)。
WebClient不是一个富web客户端。它甚至不知道如何实现cookie。
所以我陷入了僵局。一种方法是尝试对应用程序期望的富客户端的所有功能进行反向工程,并在类固醇类上编写一个WebClient,足够好地模拟富客户端,以便登录。
或者,我可以尝试将IE (或其他富客户端)嵌入到我的应用程序中,并希望公开的界面足够丰富,这样我就可以通过编程方式填写用户名和密码字段,然后将表单发送回来。(并访问响应流,这样我就可以解析HTML来抓取我想要的数据……)
或者我可以寻找一些比WebClient丰富得多的第三方控件。
谁能给我一些敏锐的洞察力,让我把注意力集中在哪里?
这既是一个项目,也是一次学习经历。也就是说,我真的想从目标站点自动登录和信息检索。
发布于 2012-11-15 15:30:33
下面是我用来登录网站并获取cookie的一个示例函数
string loginSite(string url, string username, string password)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string cookie = "";
//this values will change depending on the website
string values = "vb_login_username=" + username + "&vb_login_password=" + password
+ "&securitytoken=guest&"
+ "cookieuser=checked&"
+ "do=login";
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = values.Length;
CookieContainer a = new CookieContainer();
req.CookieContainer = a;
System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error
using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) { writer.Write(values); }
HttpWebResponse c = (HttpWebResponse)req.GetResponse();
Stream ResponseStream = c.GetResponseStream();
StreamReader LeerResult = new StreamReader(ResponseStream);
string Source = LeerResult.ReadToEnd();
foreach (Cookie cook in c.Cookies) { cookie = cookie + cook.ToString() + ";"; }
return cookie;
} 下面是一个调用示例:
string Cookie = loginSite("http://theurl.comlogin.php?s=c29cea718f052eae2c6ed105df2b7172&do=login", "user", "passwd");
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.theurl.com");
//once you got the cookie you add it to the header.
req.Headers.Add("cookie", Cookie);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
using (Stream respStream = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(respStream))
{
string s = sr.ReadToEnd();
HtmlReturn = s;
// System.Diagnostics.Debugger.Break();
}
}使用Firefox,您可以使用扩展HTTP-Header来了解post设置了哪些参数,并修改变量值:
string values = "vb_login_username=" + username + "&vb_login_password=" + password
+ "&securitytoken=guest&"
+ "cookieuser=checked&"
+ "do=login";与目标网站上的参数匹配。
如果你决定为firefox使用Live-HTTP- headers,当你登录网站时,你将从headers中获得帖子信息,类似于:
Gecko GET / HTTP/1.1主机: www.microsoft.com用户代理: Mozilla/5.0 (Windows NT6.1;rv:15.0) Gecko/20100101火狐/15.0.1接受:文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,/;q=0.8接受语言: es-es,es;q=0.8,en-us;q=0.5,en;Cookie接受编码: gzip,放气连接:保持连接: WT_FPC=id=82.144.112.152-154450144.30258861:lv=1351580394112:ss=1351575867559;WT_NVR_RU=0=msdn:1=:2=;omniID=0d2276c2_bbdd_4386_a11d_f8da1dbc5489;MUID=349E06C547426937362B02CC434269B9;MC1=GUID=47b2ed8aeea0de4797d3a40cf549dcbb&HASH=8aed&LV=201210&V=4&LU=1351608258765;A=I&I=AxUFAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg!!&V=4;msdn=L=en-US
发布于 2012-11-15 15:39:29
我怀疑你也许能够构建一个Chrome扩展来为你做这件事。
发布于 2012-11-29 15:58:44
你为什么不使用IE,在Windows窗体中自动化IE是非常简单的,而且你还可以很容易地处理代理。
https://stackoverflow.com/questions/13391383
复制相似问题