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;
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);
} }</pre> [Code Challenge #1](http://www.enginpolat.com/code-challenge-1/) ve [C# ile Google PageRank Bulma](http://www.enginpolat.com/csharp-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.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484