C# 登录到网站

C# 登录到网站,c#,login,screen-scraping,C#,Login,Screen Scraping,我是C#新手,但碰巧我需要以编程方式登录到特定的网站,以便在C#中进行屏幕抓取。我已经做了在线研究(这个网站特别有用),并且我了解到我需要使用以下对象/类之一才能登录:WebRequest/WebResponse,HttpWebRequest/HttpWebResponse,WebClient,我还需要将从网站收到的cookies传递给后续的(屏幕抓取)请求。一、 但是,我一直无法成功登录,此时我已经没有想法了。我想在主页上登录------然后在屏幕上刮取一些像这样的页面------。该网站的工

我是C#新手,但碰巧我需要以编程方式登录到特定的网站,以便在C#中进行屏幕抓取。我已经做了在线研究(这个网站特别有用),并且我了解到我需要使用以下对象/类之一才能登录:
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。稍后我可能会为其他可能遇到同样问题的人发布更详细的回复。