使用HttpWebRequest登录网页

时间:2010-12-01 10:01:14

标签: c# .net asp.net httpwebrequest webclient

我正在尝试使用HttpWebRequest登录以下网站。我使用Credentials属性传递用户名和密码,但继续返回网站的登录页面。任何人都可以解释我做错了什么。

https://oyster.tfl.gov.uk/oyster/entry.do(登录页面)

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.ContentType = "application/x-www-form-urlencoded"; 
request.Credentials = new NetworkCredential(Username, Password);
request.Method = "POST";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers.Add("Accept-Language: en-us,en;q=0.5");
request.Headers.Add("Accept-Encoding: gzip,deflate");
request.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
request.KeepAlive = true;
request.Headers.Add("Keep-Alive: 300");
request.Referer = Url;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    string tmp = reader.ReadToEnd();
}

3 个答案:

答案 0 :(得分:1)

请注意Terms and Conditions

  

禁止以下[......剪辑...]

     

使用任何自动化系统,软件   或过程来提取内容和/或   数据,包括拖网,数据挖掘   和屏幕抓取。

Credentials用于基本/ etc http安全 - 基于表单的安全性。

如果存在API,最好使用API​​。 HTML表单适用于人类,而不是计算机。看起来有一个beta TfL API here

答案 1 :(得分:0)

该页面上没有HTTP身份验证(Basic,Digest,NTLM),因此Credentials将不执行任何操作。

您需要构建一个POST /oyster/security_check,将用户名和密码作为内容发送(如果表单是GET,则要发送的数据与您在查询字符串中看到的相同,例如{{ 1}}。为此后续请求维护cookie。

答案 2 :(得分:0)

这是一个你可能觉得非常有用的C#类。

使用起来非常简单,并具有下载字符串或字节数组的基本功能。它还会扫描登录页面表单,以获取某些网站用来阻止编程身份验证的身份验证令牌。我已经尝试过很多像Facebook这样的网站,它看起来效果很好。

[已删除链接]