使用WebClient或WebRequestlogin到网站并访问数据

我正尝试使用WebClient / WebRequest访问网站上的受限数据。 该网站没有官方的API,所以我想要做的只是填写HTML表单,并将值发布到服务器,所以我login。

我试过这个和这个 ,但它看起来不像即将到来的请求login。

后者的例子更吸引人,因为我显然更喜欢WebClient ,但是传统的WebRequest会做。

无论如何,在第一个例子中,我认为它已经login,但即将到来的请求访问私人数据返回一个消息“这是仅限会员的内容”的页面。

如何使WebClient永久login?

这就是我所做的工作( 信用 )。

首先添加这个类:

 namespace System.Net { using System.Collections.Specialized; using System.Linq; using System.Text; public class CookieAwareWebClient : WebClient { public void Login(string loginPageAddress, NameValueCollection loginData) { CookieContainer container; var request = (HttpWebRequest)WebRequest.Create(loginPageAddress); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var query = string.Join("&", loginData.Cast<string>().Select(key => $"{key}={loginData[key]}")); var buffer = Encoding.ASCII.GetBytes(query); request.ContentLength = buffer.Length; var requestStream = request.GetRequestStream(); requestStream.Write(buffer, 0, buffer.Length); requestStream.Close(); container = request.CookieContainer = new CookieContainer(); var response = request.GetResponse(); response.Close(); CookieContainer = container; } public CookieAwareWebClient(CookieContainer container) { CookieContainer = container; } public CookieAwareWebClient() : this(new CookieContainer()) { } public CookieContainer CookieContainer { get; private set; } protected override WebRequest GetWebRequest(Uri address) { var request = (HttpWebRequest)base.GetWebRequest(address); request.CookieContainer = CookieContainer; return request; } } } 

用法:

 public static void Main() { var loginAddress = "www.mywebsite.com/login"; var loginData = new NameValueCollection { { "username", "shimmy" }, { "password", "mypassword" } }; var client = new CookieAwareWebClient(); client.Login(loginAddress, loginData); } 

HTTP是无状态的。 因此,WebClient不能永久login。会话的概念在HTTP中不存在。 诸如ASP.NET之类的服务器端技术通过使用cookie或者在每个请求中来回发送的查询string参数的会话概念来模拟有状态行为。 话虽如此,有可能模仿浏览器从WebClient做什么。 如果您有权访问该网站,请使用正确的凭据连接到该网站,并使用Fiddler捕获stream量。 然后,确保WebClient发送与浏览器完全相同的正确的cookie,请求标题,查询string等。