Crawler | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar crawler

ASP.NET 4.0 SEO Geliştirmeleri

12 January 2010 2 yorum

Search Engine Optimization (Arama Motoru Optimizasyonu), internette yayınlanan her site için çok önemlidir. Günümüzde sitelerin trafiklerinin büyük oranı arama motorlarından gelmektedir. Web sitelerinin arama sonuçlarında daha iyi yer edinmeleri alacakları trafik açısından gittikçe daha önemli hale gelmektedir.

Web sitenizin SEO-Uyumluluğunu Google Analytics ile kolaylıkla ölçebilirsiniz.

ASP.NET 4.0 SEO Geliştirmeleri

ASP.NET 4.0 SEO uyumluluğu ile ilgili olarak bir dizi yenilik-geliştirme ile birlikte geliyor. Bunlardan bazıları;

  • Yeni Page.MetaKeywords ve Page.MetaDescription özellikleri
  • ASP.NET Web Forms’ta yeni gelen URL Yönlendirme (URL Routing) desteği
  • Yeni Response.RedirectPermanent() methodu

Bu özellikleri inceleyelim;

Page.MetaKeywords and Page.MetaDescription Özellikleri

Arama motorlarının crawler dediği programcıklar, sitenizi indekslerken, <head> tagı içerisinde yeralan <meta name=”keywords”> ve <meta name=”description”> taglarını kullanarak sitenizi kategorize eder.

<head runat="server">
	<title>Örnek Sayfa</title>
	<meta name="keywords" content="aspnet, engin polat, geliştirme, framework" />
	<meta name="description" content="ASP.NET 4.0 ile yeni gelen özellikler" />
</head>

ASP.NET 4.0’dan önce, bu taglara programatik olarak erişmek mümkün değildi. ASP.NET 4.0 ile birlikte aşağıdaki kodları yazabiliyoruz;

public void Page_Load(object sender, EventArgs e)
{
	Page.Title = "Örnek Sayfa";

	Page.MetaKeywords = "aspnet, engin polat, geliştirme, framework";
	Page.MetaDescription = "ASP.NET 4.0 ile yeni gelen özellikler";
}
<%@ Page Title="Örnek Sayfa"
	Keywords = "aspnet, engin polat, geliştirme, framework"
	Description = "ASP.NET 4.0 ile yeni gelen özellikler"
	CodeBehind = "OrnekSayfa.aspx.cs"
	Inherits = "OrnekWebSitesi.OrnekSayfa" %>

Yukarıdaki kodlar sayesinde Page sınıfının Keyword ve Description özelliklerine programatik olarak erişmek mümkündür.

ASP.NET Web Formlarında URL Yönlendirme (URL Routing)

URL Yönlendirme özelliği ilk olarak ASP.NET 3.5 SP1 ile gelmişti ve ASP.NET MVC ile zaten kullanabiliyorduk. URL Yönlendirme özelliği sayesinde, web uygulamasına gelecek tüm isteklerin fiziksel dosyalara gelmesi zorunluluğu ortadan kalkıyor. Artık aşağıdakiler gibi Arama Motoru Uyumlu (SEO – Friendly) URL’ler tanımlayabiliyoruz;

http://www.orneksite.com/sayfa.aspx?id=5
yerine
http://www.orneksite.com/sayfa/hakkinda

veya

http://www.orneksite.com/urunler.aspx?kategori=yazilim
yerine
http://www.orneksite.com/urunler/yazilim

ASP.NET 4.0 URL Yönlendirme (URL Routing) ile ilgili detaylı bir yazıyı yakında yayınlayacağım.

Response.RedirectPermanent() methodu

Web uygulamalarımızda, belli durumlarda akışı başka bir sayfaya yönlendirmek sıklıkla yaptığımız birşeydir. ASP.NET ile genellikle Response.Redirect() method’unu kullanırız. Aslında Response.Redirect() method’unun yaptığı şey, browser’a HTTP 302 (Temporary Redirect – Geçici Yönlendirme) sonucu döndürmektir. Böylece browser yönlendirmek istenen sayfadan akışa devam eder.

Arama motorlarının sayfaları indexlemeye yarayan crawler uygulamaları, bir sayfadan diğerine geçici olarak yönlendirme olduğunu gördüğünde (HTTP 302 mesajı) akışa yeni sayfadan devam etmez. Bu da sitenizde bulunmasına rağmen indexlenmeyen sayfalar oluşmasına yol açar.

ASP.NET 4.0 ile birlikte Response.RedirectPermanent() method’u geliyor. Bu method çağırıldığında, browser’a HTTP 302 mesajı yerine HTTP 301 (Moved Permanently – Kalıcı Olarak Taşındı) mesajı döndürür. Crawler’lar, HTTP 301 mesajı gördüklerinde akışa yeni sayfadan devam ettikleri için, web sitesinin tamamı indexlenecektir.

Response.Redirect(“YeniSayfa.aspx”); // HTTP 302 mesajı ile YeniSayfa.aspx’ten akış devam eder. Crawler indexlemez.

Response.RedirectPermanent(“YeniSayfa.aspx”); // HTTP 301 mesajı ile YeniSayfa.aspx’ten akış devam eder. Crawler indexler.

ASP.NET MVC ile kullanılmak üzere Response.RedirectToRoutePermanent() methodu geliyor.

Response.RedirectToRoute(“Urunler-Listele”, new { kategori = “yazilim” }); // HTTP 302 mesajı döner. Crawler indexlemez.

yerine

Response.RedirectToRoutePermanent(“Urunler-Listele”, new { kategori = “yazilim” }); // HTTP 301 mesajı döner. Crawler indexler.

Sonuç olarak, ASP.NET 4.0 Arama Motoru Dostu ( SEO – Friendly ) uygulama yazmayı kolaylaştıran araçlara sahip olarak geliyor.

C# ile Image Crawler Uygulaması

29 December 2009 5 yorum

Daha önce yazdığımız C# ile WebCrawler Uygulamasına ek olarak, bu sefer, sayfadaki resimleri bulup, ekranda gösteren bir uygulama yazacağız.

Uygulamamız, bir web sayfasına bağlacak, sayfadaki img taglarının src değerlerini bir diziye dolduracak ve bu diziyi ekranda gösterecek. Dizi’den bir satır seçildiğinde, ilgili resmi ekrana getirecek.

Hemen aşağıdaki ekran görüntüsünü oluşturarak uygulamayı yazmaya başlayalım;

Bir web sayfasındaki resimleri bulmak için, List<string> tipinde değer döndüren ResimleriBul() isimli fonksiyon yazacağız. Bu fonksiyon adres bilgisini parametre olarak alacak, sayfadaki her img tagının src özelliğini bir listeye ekleyecek. Geriye bu liste’yi döndürecek.

private List<string> ResimleriBul(string adres)
{
	List<string> arrReturn = new List<string>();

	WebRequest wr = WebRequest.Create(txtAdres.Text);
	WebResponse ws = wr.GetResponse();
	StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
	string response = sr.ReadToEnd();
	sr.Close();
	ws.Close();

	string imageHtmlCode = "<img";
	string imageSrcCode = "src=\"";

	int index = response.IndexOf(imageHtmlCode);
	while (index != -1)
	{
		response = response.Substring(index);

		int tagSonu = response.IndexOf('>');
		int baslangic = response.IndexOf(imageSrcCode) + imageSrcCode.Length;
		int bitis = response.IndexOf('"', baslangic + 1);

		if (bitis > baslangic && baslangic < tagSonu)
			arrReturn.Add(response.Substring(baslangic, bitis - baslangic));

		if (imageHtmlCode.Length < response.Length)
			index = response.IndexOf(imageHtmlCode, imageHtmlCode.Length);
		else
			index = -1;
	}

	return arrReturn;
}

ResimleriBul butonunun Click olayında, ResimleriBul() fonksiyonunun döndürdüğü her öğe, ListBox kontrolüne dolduracak.

private void btnResimleriBul_Click(object sender, EventArgs e)
{
	lbResimListe.Items.Clear();

	foreach (string image in ResimleriBul(txtAdres.Text))
		lbResimListe.Items.Add(image);
}

Son olarak, ListBox’ın seçili elemanı her değiştiğinde, PictureBox’ta seçili resim gösterilecek.

private void lbResimListe_SelectedIndexChanged(object sender, EventArgs e)
{
	pbResim.Load(lbResimListe.SelectedItem.ToString());
}

Uygulamanın kaynak kodlarını buradan indirebilirsiniz.

C# ile WebCrawler Uygulaması

24 December 2009 11 yorum

Google, Bing, Yahoo gibi arama motorları, internetteki sayfaları indexlemek için web crawler denilen programcıklar kullanırlar.

Crawler’ların çalışma mantığı basittir;

  1. Web sayfasına git
  2. Sayfanın içeriğini indexle
  3. Sayfadaki her link için 1. adıma geri dön

Crawler’ın, sayfadaki linkleri bulabilmesi anahtar adımdır.

Yazacağımız uygulamada, bir web crawler gibi sayfadaki linkleri bulacağız.

Ekran görüntüsündeki formu oluşturduktan sonra, Buton‘un Click olayına ait kodu yazmaya başlayalım.

private void btnLinkleriBul_Click(object sender, EventArgs e)
{
	WebRequest wr = WebRequest.Create(txtAdres.Text);
	WebResponse ws = wr.GetResponse();
	StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
	string response = sr.ReadToEnd();
	sr.Close();
	ws.Close();

	Regex r = new Regex("<a.+href=\"http.+://(.+)\">(.*)</a>");
	foreach (Match m in r.Matches(response))
	{
		string link = m.Groups[1].Value;
		if (link.IndexOf("\"") > -1)
			link = link.Substring(0, link.IndexOf("\""));
		string metin = m.Groups[2].Value;

		ListViewItem oItem = new ListViewItem(new string[] { metin, link });
		lvSonuc.Items.Add(oItem);
	}
}

Code Challenge #1 ve C# ile Google PageRank Bulma yazılarında kullandığım tekniğin aynısı ile sayfanın içeriğini string değişkene alıyoruz.

WebRequest wr = WebRequest.Create(txtAdres.Text);
WebResponse ws = wr.GetResponse();
StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
string response = sr.ReadToEnd();
sr.Close();
ws.Close();

Daha sonra, Regex sınıfından yeni bir örnek oluşturup (constructer’ına verdiğimiz parametre önemli), dönen sonuç kümesinin içeriğini ListView kontrolüne dolduruyoruz.

Eğer sayfanın içeriğini tuttuğumuz değişkeni veritabanına yazsak, ve sayfada bulduğumuz her link için bu adımları tekrar yapsak, tam bir web crawler uygulaması yazmış olacaktık.

Ama bu noktadan itibaren uygulamayı geliştirmeyi size bırakıyorum (BilgeAdam’daki öğrencilerime hep dediğim gibi, “Bundan sonrası size ödev!”)

Projenin bu halini şuradan indirebilirsiniz.