2013-03-04 14 views
6

używam tego kodu, aby się zalogować:Jak przekazać pliki cookie do HtmlAgilityPack lub WebClient?

CookieCollection cookies = new CookieCollection(); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("example.com"); 
request.CookieContainer = new CookieContainer(); 
request.CookieContainer.Add(cookies); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
cookies = response.Cookies; 

string getUrl = "example.com"; 
string postData = String.Format("my parameters"); 
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); 
getRequest.CookieContainer = new CookieContainer(); 
getRequest.CookieContainer.Add(cookies); 
getRequest.Method = WebRequestMethods.Http.Post; 
getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"; 
getRequest.AllowWriteStreamBuffering = true; 
getRequest.ProtocolVersion = HttpVersion.Version11; 
getRequest.AllowAutoRedirect = true; 
getRequest.ContentType = "application/x-www-form-urlencoded"; 

byte[] byteArray = Encoding.ASCII.GetBytes(postData); 
getRequest.ContentLength = byteArray.Length; 
Stream newStream = getRequest.GetRequestStream(); 
newStream.Write(byteArray, 0, byteArray.Length); 
newStream.Close(); 

HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream(), Encoding.GetEncoding("windows-1251"))) 
{ 
     doc.LoadHtml(sr.ReadToEnd()); 
     webBrowser1.DocumentText = doc.DocumentNode.OuterHtml; 
} 

następnie chcę użyć HtmlWeb (HtmlAgilityPack) lub webclient do analizowania HTML do HTMLDocument (HtmlAgilityPack).

Moim problemem jest to, że gdy używam:

WebClient wc = new WebClient(); 
webBrowser1.DocumentText = wc.DownloadString(site); 

lub

doc = web.Load(site); 
webBrowser1.DocumentText = doc.DocumentNode.OuterHtml; 

Identyfikator logowania znikają więc myślę, że muszę jakoś przekazać cookies .. Jakieś sugestie?

+0

@ShahroozJefri nie jest to odpowiedź – a1204773

+0

zobacz http: // stackoverflow. com/questions/5562948/htmlagilitypack-htmldocument-cookies/5683180 # 5683180 –

Odpowiedz

17

Sprawdź HtmlAgilityPack.HtmlDocument Cookies

Oto przykład tego, co szukasz (składnia nie testowane w 100%, po prostu zmodyfikowany jakąś klasę Zwykle używam):

public class MyWebClient 
{ 
    //The cookies will be here. 
    private CookieContainer _cookies = new CookieContainer(); 

    //In case you need to clear the cookies 
    public void ClearCookies() { 
     _cookies = new CookieContainer(); 
    } 

    public HtmlDocument GetPage(string url) { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "GET"; 

     //Set more parameters here... 
     //... 

     //This is the important part. 
     request.CookieContainer = _cookies; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     var stream = response.GetResponseStream(); 

     //When you get the response from the website, the cookies will be stored 
     //automatically in "_cookies". 

     using (var reader = new StreamReader(stream)) { 
      string html = reader.ReadToEnd(); 
      var doc = new HtmlDocument(); 
      doc.LoadHtml(html); 
      return doc; 
     } 
    } 
} 

Oto jak go używać :

var client = new MyWebClient(); 
HtmlDocument doc = client.GetPage("http://somepage.com"); 

//This request will be sent with the cookies obtained from the page 
doc = client.GetPage("http://somepage.com/another-page"); 

Uwaga: Jeśli też chcesz użyć POST metody, wystarczy utworzyć metodę podobną do GetPage z POST logika byłaby klasę itd

2

Istnieją pewne zalecenia tutaj: Using CookieContainer with WebClient class

Jednakże, jest to prawdopodobnie po prostu łatwiej utrzymać pomocą HttpWebRequest i ustawić cookie w CookieContainer:

Kod wygląda mniej więcej tak:

// Create a HttpWebRequest 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(getUrl); 

// Create the cookie container and add a cookie 
request.CookieContainer = new CookieContainer(); 

// Add all the cookies 
foreach (Cookie cookie in response.Cookies) 
{ 
    request.CookieContainer.Add(cookie); 
} 

Drugą rzeczą jest to, że nie ma potrzeby, aby ponownie pobrać stronę, ponieważ masz już go z odpowiedzią internetową i jesteś zapisując go tutaj:

HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream(), Encoding.GetEncoding("windows-1251"))) 
{ 
     webBrowser1.DocumentText = doc.DocumentNode.OuterHtml; 
} 

powinny być mógł po prostu wziąć HTML i przetwarza go z HTML Agility dodatku:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(webBrowser1.DocumentText); 

i to powinno wystarczyć ... :)

+0

Loguję się na stronę, ale potem chcę nawigować w innym miejscu na tej stronie. Właściwie to szukam na stronie. – a1204773

+0

W każdym zgłoszeniu musisz podawać pliki cookie. Jeśli nie dostarczysz ciasteczek przy każdym żądaniu, to założysz, że wylogowałeś się (większość danych logowania znajduje się w pliku cookie). – Kiril

+0

do logowania używam funkcji 'login();', czy mógłbyś mi pomóc zrobić funkcję 'getHTML (url);' ponieważ powyższy kod nie jest kompletny. – a1204773

0

buforowania Spróbuj ciasteczka z poprzedniej odpowiedzi lokalnie i wyślij je ponownie każdy wniosek internetowej następująco:

private CookieCollection cookieCollection; 

... 

    parserObject = new HtmlWeb 
       { 
        AutoDetectEncoding = true, 
        PreRequest = request => 
        { 
         if (cookieCollection != null) 
          cookieCollection.Cast<Cookie>() 
           .ForEach(cookie => request.CookieContainer.Add(cookie)); 
         return true; 
        }, 
        PostResponse = (request, response) => { cookieCollection = response.Cookies; } 
       }; 
Powiązane problemy