C# 登录到网站
我是C#新手,但碰巧我需要以编程方式登录到特定的网站,以便在C#中进行屏幕抓取。我已经做了在线研究(这个网站特别有用),并且我了解到我需要使用以下对象/类之一才能登录:C# 登录到网站,c#,login,screen-scraping,C#,Login,Screen Scraping,我是C#新手,但碰巧我需要以编程方式登录到特定的网站,以便在C#中进行屏幕抓取。我已经做了在线研究(这个网站特别有用),并且我了解到我需要使用以下对象/类之一才能登录:WebRequest/WebResponse,HttpWebRequest/HttpWebResponse,WebClient,我还需要将从网站收到的cookies传递给后续的(屏幕抓取)请求。一、 但是,我一直无法成功登录,此时我已经没有想法了。我想在主页上登录------然后在屏幕上刮取一些像这样的页面------。该网站的工
WebRequest/WebResponse
,HttpWebRequest/HttpWebResponse
,WebClient
,我还需要将从网站收到的cookies传递给后续的(屏幕抓取)请求。一、 但是,我一直无法成功登录,此时我已经没有想法了。我想在主页上登录------然后在屏幕上刮取一些像这样的页面------。该网站的工作原理是这样的:它允许用户访问我所引用的页面,但除非用户登录,否则它会在某些字段中返回星号。我认为这意味着内容是动态生成的,我怀疑这可能是我登录问题的根本原因。我包括登录网站时使用的代码:
class Program
{
private static string link_main_page = "-----------";
private static string link_target_page = "------------";
private static string authorization_param = "----------";
private static void LoginUsingTheHttpWebRequestClass()
{
HttpWebRequest MyLoginRequest = (HttpWebRequest)WebRequest.Create(link_main_page);
MyLoginRequest.Method = "POST";
MyLoginRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.1; .NET4.0C; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
MyLoginRequest.ContentType = "application/x-www-form-urlencoded";
MyLoginRequest.CookieContainer = new CookieContainer();
byte[] sentData = Encoding.UTF8.GetBytes(authorization_param);
MyLoginRequest.ContentLength = sentData.Length;
Stream sendStream = MyLoginRequest.GetRequestStream();
sendStream.Write(sentData, 0, sentData.Length);
HttpWebResponse MyLoginResponse = (HttpWebResponse)MyLoginRequest.GetResponse();
CookieCollection MyCookieCollection = new CookieCollection();
MyCookieCollection.Add(MyLoginResponse.Cookies);
foreach (Cookie MyCookie in MyCookieCollection)
{
Console.WriteLine("Cookie:");
Console.WriteLine("{0} = {1}", MyCookie.Name, MyCookie.Value);
}
HttpWebRequest MyGetRequest = (HttpWebRequest)WebRequest.Create(link_target_page);
MyGetRequest.ContentType = "application/x-www-form-urlencoded";
MyGetRequest.Method = "GET";
MyGetRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.1; .NET4.0C; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
MyGetRequest.CookieContainer = new CookieContainer();
MyGetRequest.CookieContainer.Add(MyCookieCollection);
HttpWebResponse MyGetResponse = (HttpWebResponse)MyGetRequest.GetResponse();
Stream stream;
stream = MyGetResponse.GetResponseStream();
string s;
using (StreamReader sr = new StreamReader(stream))
{
s = sr.ReadToEnd();
using (StreamWriter sw = File.CreateText("TheFile.htm"))
{
sw.Write(s);
sw.Close();
}
sr.Close();
}
}
private static void LoginUsingTheWebRequestClass()
{
WebRequest MyLoginRequest = WebRequest.Create(link_main_page);
MyLoginRequest.Method = "POST";
MyLoginRequest.ContentType = "application/x-www-form-urlencoded";
byte[] sentData = Encoding.UTF8.GetBytes(authorization_param);
MyLoginRequest.ContentLength = sentData.Length;
Stream sendStream = MyLoginRequest.GetRequestStream();
sendStream.Write(sentData, 0, sentData.Length);
WebResponse MyLoginResponse = MyLoginRequest.GetResponse();
string CookieHeader;
CookieHeader = MyLoginResponse.Headers["Set-cookie"];
Console.WriteLine("Cookie:");
Console.WriteLine(CookieHeader);
WebRequest MyGetRequest = WebRequest.Create(link_target_page);
MyGetRequest.ContentType = "application/x-www-form-urlencoded";
MyGetRequest.Method = "GET";
MyGetRequest.Headers.Add("Cookie", CookieHeader);
WebResponse MyGetResponse = MyGetRequest.GetResponse();
Stream stream;
stream = MyGetResponse.GetResponseStream();
string s;
using (StreamReader sr = new StreamReader(stream))
{
s = sr.ReadToEnd();
using (StreamWriter sw = File.CreateText("TheFile2.htm"))
{
sw.Write(s);
sw.Close();
}
sr.Close();
}
}
static void Main(string[] args)
{
Console.WriteLine("Login Using the HttpWebRequest Class");
LoginUsingTheHttpWebRequestClass();
Console.WriteLine("Login Using the WebRequest Class");
LoginUsingTheWebRequestClass();
Console.WriteLine("Done! Press any key to continue");
Console.ReadKey();
}
}
尝试使用HttpWebRequest/HttpWebResponse登录和尝试使用WebRequest/WebResponse登录都不起作用。第一个返回的cookie如下所示:
PHPSESSID=HNCr0。。。
第二个返回的cookie如下所示:
PHPSESSID=88dn1n9。。。;路径=/
我觉得这些饼干很可疑。一方面,它们看起来不同于IE中的饼干。但我不知道我到底应该期待什么。
(我还尝试将通过(Http)WebRequest/(Http)WebResponse接收到的cookie传递给WebClient,但同样无效-我在此处不包括cookie以节省空间)
如果您有任何意见,我将不胜感激。如果有人想运行代码,我可以提供实际的登录/密码信息(在该网站上注册是免费的)。是的,请提供登录/密码信息。@Darin Dimitrov:我在代码中包含了登录/密码;此外,我设置了UserAgent属性(它仍然无法登录),我已经从代码中删除了登录和密码数据以及对特定网页的引用。我已经解决了。简而言之,我使用的authorization_param字符串是错误的(我是在Firefox Tamper数据加载项的帮助下发现的),非常重要的是,我必须将MyLoginRequest.AllowAutoRefresh属性设置为false。稍后我可能会为其他可能遇到同样问题的人发布更详细的回复。