我正在尝试使用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();
}
答案 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这样的网站,它看起来效果很好。
[已删除链接]