Htmlagilitypack после входа в систему
Я хочу разобрать какой-нибудь сайт HTML, как Facebook,
Например (www.facebook.com/somePage)
Если я хочу вставить эту ссылку в свой проводник, он перенаправляет меня, чтобы сначала войти в мою учетную запись. Так что я не вижу эту страницу. Поэтому я не могу использовать Htmlagilitypack, чтобы получить ответ.
Итак, как я могу сначала войти на сайт программно (без использования веб-браузера), затем вызвать эту страницу на Facebook, получить ответ и проанализировать пакет Htmlagility. Я знаю, как я могу использовать пакет HtmlAgility, и я знаю, как устанавливать файлы cookie с помощью Httprequest. Я использую следующий код для установки файлов cookie, но после этого, как я могу разобрать эту страницу
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);
}
1 ответ
На ваше HttpWebRequest
позвонить GetResponse
метод. Это дает WebResponse
объект, по которому можно позвонить GetResponseStream()
чтобы добраться до содержания.
Поскольку Facebook практически не возвращает HTML-контент (они отправляют загрузку Javascript для браузера, из которого создается документ), пакет HtmlAgilityPack на самом деле вам не поможет. Он загрузит Javascript, но не сможет его выполнить, поэтому вы застряли с документом, который трудно интерпретировать.
Другие Html-пакеты, такие как Awesonium или PhantomJS, могут на самом деле выполнять Javascript и возвращать вам интерпретированный HtmlDomDocument. Для этого не требуется запускать весь браузер, они могут запускать оба безголовых (так как он вызывается для запуска браузера без пользовательского интерфейса поверх него).
Кроме того, используйте API Graph Facebook для доступа к данным на Facebook без разбора HTML, он намного более стабилен и построен для точной цели взаимодействия с данными на Facebook.