ASP.NET ile Google sonuçlarını Html Parse etmek ve Arama Merkezi yapmak

Google sonuçlarını Html parse etmek sanıldığından daha basit bir iş. Tek yapmamız gereken Google sonuçlarını parse etmek için kullanışlı bir API (kütüphane) kullanmak ve ASP.NET'de Google sonuçlarını Html formatında almak için .NET HttpWebRequest nesnesinden yararlanmak. Ayrıca bu API ve HttpWebRequest nesnesini kullanarak basit bir arama merkezi yapabiliriz. Uygulamamızda Google'dan gelen sonuçları seçeneklere göre ayarlayacağız. Uygulamanın çalışır haline asp.net-ile-google-arama-merkezi linkinden ya da aşağıdaki resimden bakabilirsiniz:

asp-net-google-arama-merkezi-html-parse

Google'dan gelen sonuçları Html parse edeceğimiz için kullacağımız API HtmlAgilityPack olacak. HtmlAgilityPack kütüphanesini asp-net-html-parser-htmlagilitypack linkinden indirin. Ardından aşağıdaki resimde gösrerildiği gibi web projenizin App_Code klasörüne HtmlAgilityPack kütüphanesini ekleyin:

asp-net-google-html-parse-yukleme

Şimdi projemize yeni bir .aspx sayfası ekeyelim (mesela googlearama.aspx) ve arama parametreleni kullanıcıdan almak için aşağıdaki gibi asp.net sunucu kontrollerini ekleyelim:
<form id="form1" runat="server">
    <div>
         Aranacak Kelime :
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1"
            runat="server" Text="ara" onclick="Button1_Click" />
             <br />  <br />
         Aranacak seçenkleri :   
        <asp:CheckBoxList ID="CheckBoxList1" runat="server">
            <asp:ListItem Selected="True"> English </asp:ListItem>
            <asp:ListItem> Türkçe </asp:ListItem>
        </asp:CheckBoxList>
        
        Sonuç Sayısı :
        <asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem Value="10"> 10 </asp:ListItem>
         <asp:ListItem Value="20"> 20 </asp:ListItem>
          <asp:ListItem Value="30"> 30 </asp:ListItem>
           <asp:ListItem Value="40"> 40 </asp:ListItem>
            <asp:ListItem Value="50"> 50 </asp:ListItem>
        </asp:DropDownList>
        <br />  <br />
        <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </div>
</form> 
Kullanıcadan parametreleri aldıktan sonra sunucu tarafında Google.com ile bağlantı kurup arama sonuçlarını alacağız ve Html parse edeceğiz. Tabii bunun için sayfaya bazı isim uzaylarını eklememiz gerek:
using System.Net;  // HttpWebRequest objesini kullanmak için
using System.IO;  // Stream işlemleri için
using HtmlAgilityPack;  // Html parse için
using System.Text;  // Encoding (karakter kodlamak için)
Şimdu Google arama merkezinin asıl işini yapacak kodlarını ekleyelim. Her satırı yorumlayarak açıkça anlatmaya çalıştım. googlearama.aspx sayfasında ara buttonuna click olayını eklemiştik. Bu olayın fonksiyonunu yazacağız. Aşağıdaki kodun uzunluğuna aldanmayın. Asıl işi yapan satırlar 10'u geçmez. Codebehind (googlearama.aspx.cs) dosyasına ekleyeceğimiz c sharp kodumuz:
     protected void Button1_Click(object sender, EventArgs e)
    {
        Uri ur = null ;
        Label1.Text = "";

        // Bu kısımda sonuçları google.com'den alıyoruz

        // English seçeneğinin check edip edilmediğini kontrol ediyoruz.
        if (CheckBoxList1.Items[0].Selected)
        {
            // Google'a yollayacağımız sorguyu hazırlıyoruz
            string google = "http://www.google.com/search?num="+DropDownList1.SelectedValue+"&q=";

            // Aranacak kelimeyi sorguya ekliyoruz
            ur = new Uri(google + TextBox1.Text);

            // Burada hazırladığımız soruguyu Google'a yolluyoruz
            HttpWebRequest istek = (HttpWebRequest)WebRequest.Create(ur);
            // Google'dan gelen cevabı alıyoruz
            HttpWebResponse cevap = (HttpWebResponse)istek.GetResponse();
            // Google'dan gelen cevabı encode edereken karakter sorununun
            // önüne geçmek için gelen cevabın karaktersetine göre ayarlıyoruz.
            Encoding cevapKodlama = Encoding.GetEncoding(cevap.CharacterSet);
            // Google cevabını özel encode ayarıyla birikte okuyoruz.
            StreamReader akis = new StreamReader(cevap.GetResponseStream(), cevapKodlama);

            // Burada Google'dan aldığımız html sunucunu string olarak kaydediyoruz.
            string html = akis.ReadToEnd();

            // Bu kısımda Google'dan aldığımız sonucu html parse ediyoruz.
            // Html parse ederken C SHARP HtmkAgilityPack API'sinden yararlanıyoruz.
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            // Google'dan dönen linkler class özniteliği r olan h3 elemanların içinde saklanıyor.
            // Google bunu değiştirene kadar böyle yapacağız.
            HtmlNodeCollection linkler = doc.DocumentNode.SelectNodes("//h3[@class='r']");

            // Label nesnemize sonuçları (linkleri) teker teker ekliyoruz.
            Label1.Text += "Results in English :<br />";
            // saymayı unutmamak için
            int i = 1;
            try
            {
                foreach (HtmlNode link in linkler)
                {
                    if (i == Convert.ToInt32(DropDownList1.SelectedValue) + 1) break;
                    Label1.Text += (i++) + " - " + (link.InnerHtml + "<br />");

                }
                Label1.Text += "<br /><br />";
            }
            catch (Exception exp)
            {
                Label1.Text += "<font color=\"red\"> Sonuç bulunamadı ! </font> <br /><br />";
            }
            

        }

       


        // Bu kısmın üstekinden tek farkı sonuçların google.com.tr'den alınması, diğer herşey aynı.

        // Türkçe seçeneğinin check edip edilmediğini kontrol ediyoruz.
        if (CheckBoxList1.Items[1].Selected)
        {
            string google = "http://www.google.com.tr/search?num=" + DropDownList1.SelectedValue + "&q=";

            ur = new Uri(google + TextBox1.Text);

            HttpWebRequest istek = (HttpWebRequest)WebRequest.Create(ur);
            HttpWebResponse cevap = (HttpWebResponse)istek.GetResponse();
            Encoding cevapKodlama = Encoding.GetEncoding(cevap.CharacterSet);
            StreamReader akis = new StreamReader(cevap.GetResponseStream(), cevapKodlama);

            string html = akis.ReadToEnd();

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            HtmlNodeCollection linkler = doc.DocumentNode.SelectNodes("//h3[@class='r']");
            int i = 1;
            
            Label1.Text += "Türkçe Sonuçlar : <br />";
            try
            {
                foreach (HtmlNode link in linkler)
                {
                    if (i == Convert.ToInt32(DropDownList1.SelectedValue) + 1) break;
                    Label1.Text += (i++) + " - " + (link.InnerHtml + "<br />");

                }
                Label1.Text += "<br /><br />";
            }
            catch (Exception exp)
            {
                Label1.Text += "<font color=\"red\"> Sonuç bulunamadı ! </font> <br /><br />";
            }

        }
    }
Asp.net ile Google sonuçlarını html parse etme uygulamasını bitirdik. Bu uygulumayı değiştirerek kendi ihtiyaçlarını doğrultusunda yararlanabilirsiniz. Mesela Html parse ettiğimiz linkler içinde kendi sitenizin ismini arayarak kaçıncı sırada olduğunu bulabilirsiniz. Görsellik katmak amacıyla Ajax ile bu uygulamayı donatmak daha çekici kılacaktır uygulamayı. Fakat sizden ricam eğer bu yazıdan yararlanıp bir yazı yazacak olursanız bu kaynağı belirtmeniz. Uygulamanın kodlarını asp.net-google-arama-merkezi-uygulaması linkinden indirebilirsiniz. Umarım yazı sizlere faydalı olmuştur.
yazan Zülküf Küçüközer tarih   8th September 2009
primary key words  Google | Arama sonuçları | Html parse | Asp.net okunma  12198
secondary key words  Arama merkezi
writing ümit clk writing 27th April 2010
benim bu Html parse konusunda bir sorunum var bir siteden bilgileri çekmem gerekiyor. ancak sayfadaki bir javascripte parametre yollayıp sayfa içindeki tabı değiştirip ordaki bilgileri almam gerekiyor
writing Zülküf Küçüközer writing 27th April 2010
Sorduğunuz soruyu tam olarak cevaplamam zor fakat şöyle bir şey önerebilirim: Eğer parametre yollayacağınız Javascript fonksiyonu ajax ile çalışmıyorsa paramtre yolayıp çalıştımanıza gerek yok. Çünkü gerekli tabın içindeki bilgileri de yine parse ederek alabiliyor olmanız gerek. Eğer ajax kullanıyorsa o zaman fonksiyonun nereden bilgileri aldığını anlamanız gerek.
writing mehmet writing 23rd May 2010
merhaba, yapmış olduğunuz programda diyelim aradığım veriye ulaştım onu o siteden nasıl çekebilirm hangi yolu deneye biliriz.
writing zülküf küçüközer writing 26th May 2010
"link.InnerHtml" yerine linkteki "href" değerini yani URL adresini aldıktan sonra HttpWebRequest ve HttpWebResponse classlarını kullanarak aranan verinin bulunuğu URL'nin içeriğini de çekebelirisiniz.Aynı örnekte yaptığım gibi.
writing sercan writing 23rd January 2012
Merhaba iyi günler. html parse ile veriler 100 tane geliyor maksimum. Bu sayıyı nasıl arttırabilirim ?
writing Versus writing 29th November 2012
Peki googledan aldıgımız bu sonucları nasıl rastgele listeyebilirim ? Yani direk googledan gelen sonucu ben karısı şekilde listelemne istiyorum
writing Levent writing 24th February 2013
Selamlar, geçen sene aynı teknolojiyi kullanmıştım. sizin yazdığınız kod daha derli toplu / açıklayıcı olmuş. Emeğinize sağlık.
writing levtem writing 14th October 2014
güzel paylasim tesekkürler.