Ich möchte eine HTML-Seite wie Facebook parsen,
Beispiel (www.facebook.com/somePage)
Wenn ich diesen Link in meinen Explorer einfügen möchte, wird mein Account zuerst umgeleitet. Also sehe ich diese Seite nicht. Daher kann ich Htmlagilitypack nicht verwenden, um eine Antwort zu erhalten.
Also, wie kann ich zuerst Website programmaticaly (ohne Webbrowser-Steuerelement) anmelden dann rufen Sie diese Facebook-Seite und erhalten Antwort und Pars mit Htmlagility-Paket. Ich weiß Wie kann ich das HtmlAgility-Paket verwenden und ich weiß, dass ich Cookies mit Httprequest einstellen soll? Verwenden Sie den folgenden Code, um Cookies zu setzen, aber danach, wie kann ich das somePage analysieren ?
CookieCollection cookies = new CookieCollection();
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.facebook.com");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
//Get the response from the server and save the cookies from the first request..
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cookies = response.Cookies;
response.Close();
}
catch (WebException)
{
MessageBox.Show("error");
}
string getUrl = "https://www.facebook.com/login.php?login_attempt=1";
string postData = String.Format("email={0}&pass={1}", "xxxx@hotmail.com", "xxxxx");
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(cookies); //recover cookies First request
getRequest.Method = WebRequestMethods.Http.Post;
getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
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(); //open connection
newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
newStream.Close();
//How I parse (www.facebook.com/somePage) here?
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream(), Encoding.GetEncoding("windows-1251")))
{
doc.LoadHtml(sr.ReadToEnd());
}
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
listBox1.Items.Add(link.InnerHtml);
}
HttpWebRequest
Sie in Ihrem HttpWebRequest
die GetResponse
Methode auf. Dies ergibt ein WebResponse
Objekt, auf dem Sie GetResponseStream()
aufrufen GetResponseStream()
, um zu den Inhalten zu gelangen.
Da Facebook fast keinen HTML-Inhalt zurückgibt (sie senden eine Ladung Javascript für den Browser, aus dem das Dokument generiert werden soll), wird Ihnen das HtmlAgilityPack nicht wirklich helfen. Es wird das Javascript herunterladen, aber es kann nicht ausgeführt werden, so dass Sie mit einem Dokument festhängen, das schwer zu interpretieren ist.
Andere Html-Pakete wie Awesonium oder PhantomJS können das Javascript tatsächlich ausführen und Ihnen das interpretierte HtmlDomDocument zurückgeben. Dazu müssen Sie nicht den gesamten Browser ausführen, sie können beide Headless ausführen (wie es heißt, einen Browser ohne eine UI darüber laufen zu lassen).
Alternativ können Sie mithilfe der Facebook Graph-API auf die Daten auf Facebook zugreifen, ohne den HTML-Code analysieren zu müssen. Dieser ist wesentlich stabiler und wurde speziell für die Interaktion mit Daten auf Facebook entwickelt.