HtmlAgilityPack İle Login | C#

Merhaba, HtmlAgilityPack ile bir web sayfasına kod tarafında erişip ihtiyacımız olan bilgileri alabiliriz.

Gerçek bir örnek üzerinden gidersek, fiyatları içeren bir siteden elimizdeki ürünlerin fiyatlarını almaya çalıştığımızı düşünelim.

Ancak siteye giriş kullanıcı adı ve şifre ile olsun.

Tabi ki elimizde kullanıcı adı ve şifremiz var, ancak bizim amacımız tarayıcıdan girip tek tek fiyatlara bakmak değil, bir konsol uygulaması ile bu siteye erişip fiyatları günlük/haftalık/aylık olarak kendi sistemimize almak.

Bunun için önce siteye kullanıcı adı ve şifremizle giriş yapıp çerezleri bir değişkende saklamalı, sonrasında da arama sayfasına gönderdiğimiz istekte, bu çerezlerle beraber gitmeliyiz.

readonly static string urlHedefSiteGiris = "https://www.hedefsite.xyz/login";
readonly static string urlHedefSiteArama = "https://www.hedefsite.xyz/products";
readonly static string kullaniciAdiHedefSite = "uuu";
readonly static string sifreHedefSite = "sss";
private static CookieContainer _cookies = new CookieContainer();

static void Main(string[] args)
{
girisYapHedefSite();
foreach (Urun item in LstUrun)
{
urunAraHedefSite(item);
}
}

private static void girisYapHedefSite()
{
StringBuilder sb = new StringBuilder();
parametreEkle(sb, "LoginForm[username]", kullaniciAdiHedefSite); // Burada login sayfasindaki input ismi olacak.
parametreEkle(sb, "LoginForm[password]", sifreHedefSite); // Burada login sayfasindaki input ismi olacak.
byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlHedefSiteGiris);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = _cookies;
//request.Credentials = CredentialCache.DefaultNetworkCredentials; // ??
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(byteArray, 0, byteArray.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
var stream = response.GetResponseStream();
using (var reader = new StreamReader(stream))
{
string html = reader.ReadToEnd();
var doc = new HtmlDocument();
doc.LoadHtml(html);
}
Console.WriteLine("Giris yapildi…");
}

private static void urunAraHedefSite(Urun urun)
{
StringBuilder sb = new StringBuilder();
parametreEkle(sb, "search_text", urun.No);
byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlHedefSiteArama);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = _cookies;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(byteArray, 0, byteArray.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream))
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(reader.ReadToEnd());
HtmlNodeCollection htmlNodeListSatir = doc.DocumentNode.SelectNodes("//table[contains(@class, 'itemsGrid')]/tr");
List> lst = new List>();
if (htmlNodeListSatir != null)
{
List lstHtmlNodeKategori = htmlNodeListSatir.ToList();
foreach (HtmlNode item in lstHtmlNodeKategori)
{
lst.Add(urunDetayGetir(item, urun.No));
}
}
if (lst.Count > 0)
{
// Burasi size kalmis. Nasil bir ihtiyaciniz varsa…
}
}
}

// bu metot da hedef sitenin html koduna gore farklilik gosterecektir.
private static KeyValuePair urunDetayGetir(HtmlNode htmlNode, string no)
{
try
{
string aciklama = "", marka = "", malzemeNo = "", fiyat = "";
HtmlNodeCollection htmlNodeList = htmlNode.SelectNodes("td");
for (int i = 0; i < htmlNodeList.Count; i++) { switch (i) { case 0: malzemeNo = GenelIslemler.BosluklariTemizle(htmlNodeList[i].InnerText); break; case 1: aciklama = GenelIslemler.BosluklariTemizle(htmlNodeList[i].InnerText); break; case 4: marka = GenelIslemler.BosluklariTemizle(htmlNodeList[i].InnerText); break; case 5: fiyat = GenelIslemler.BosluklariTemizle(htmlNodeList[i].InnerText); break; default: break; } } return new KeyValuePair(marka + " " + malzemeNo + " " + aciklama, Convert.ToDecimal(fiyat.Split(' ')[0], CultureInfo.GetCultureInfo("en-US")));
}
catch (Exception ex)
{
//
}
return new KeyValuePair();
}

private static void parametreEkle(StringBuilder sb, string name, string value)
{
sb.AppendFormat("{0}={1}&", name, HttpUtility.UrlEncode(value));
}

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *