Tekrar merhaba. İşten güçten fırsat bulup da oturup iki satır yazı yazamaz oldum. Sitede gezip de umduğunu bulamayanlardan şimdiden özür dilerim. Lafı fazla uzatmadan
konumuza giriş yapalım: Maksadımız C# dili ile Access komutlarını kullanmak. Öncelikle şunu belirteyim. Baştan programı yazarken çok büyük çaplı bişey tasarlamadığım için access veritabanını kullandım. Dolayısıyla performans kaybı kaçınılmaz oldu. Ancak access yerine SQL ya da daha güçlü bir veritabanı kullanırsanız çok daha performanslı bir sistem kurmuş olursunuz. C# ile daha önce Access bağlantısı kurmadıysanız buyrun burdan devam edelim.
Öncelikle bir veritabanı dosyası tasarlamalıyız. Benim basit olarak tasarladığım dosya şu şekilde: 
Gördüğünüz gibi 4 tane temel tablomuz var. Tabloların ne anlama geldiklerinden kısaca bahsedelim: Gelen tablomuz, birinci bölümde bahsettiğimiz düzenli ifadelerin, html sayfasına uygulanması sonucunda sayfadan elde ettiğimiz linklerin listesini tutar. Yani bir anlamda, programımızın GEZECEĞİ linkleri tutan tablodur. Giden tablosu da sitemizin GEZDİĞİ linkleri tutan tablodur. Siteler tablomuz ise, programımızın içinde veri arayacağı siteleri tutar. Ürünler tablomuz ise, sitelerin gezilmesi sonucu bulunan ürünleri tutan tablomuzdur.
Dilerseniz, tabloların içeriklerini de gösterelim: 
Alanların anlamlarını program içinde zaten anlayacağımız için, alanların açıklamasına şu anda girme gereği görmüyorum. Şimdi işin programcı tarafını ilgilendiren tarafına giriş yapalım. Bu veri tabanı dosyasını sistemimize entegre etmekle işe başlayalım isterseniz. Yapacağımız işlemler aslında çok basit. Visual Studio aslında işin çoğunu bizim yerimize yapar. Yine de adım adım göstermekte fayda var diye düşünüyorum: 

Bu aşamada Next ya da ileri diyerek devam ediyoruz. Bir sonraki sayfadan da NEW CONNECTION düğmesini tıklayarak ilerliyoruz. 
Access veri tabanı kullanacağımız için Microsoft Access DataBase File seçerek Continue ya da Devam diyoruz.
Hazırladığımız access dosyasını Browse ya da Gözat düğmesi ile buluyoruz. Test Connection diyerek bağlantımızı da test ettikten sonra tamam diyoruz.
Son olarak da kullanmak istediğimiz view ve tabloları seçerek yolumuza devam ediyoruz.
Proje klasörümüzde app.config dosyamıza baktığımızda, visual studio'nun bizim için bir bağlantı metni oluşturduğunu da görebiliriz. 
Evet, artık bir veritabanımız da hazır olduğuna göre, artık sorgulama, veri girme vs. veritabanı komutlarına gelebiliriz.
Öncelikle C# 'ın veritabanı erişimi için kullandığı mimariden biraz bahsedelim. Bir veriye erişmeniz için elinizde bir bağlantı metninizin bulunması gerekmektedir. Bizim projemizdeki bağlantı metninin adı : spider.Properties.Settings.linklerbag şeklindedir. Config dosyanıza gittiğinizde bu bağlantının yanında Connection String diye bir bölüm olduğunu görürsünüz. Bu bölüm işte bizim bağlantı metni olmaktadır. Proje içinde her seferinde her seferinde kocaman bir bağlantı metni yazmaktansa, config dosyanıza bir kez ekleyip daha sonra verdiğiniz isimle bu metni çağırmanız daha yararlı olacaktır.
Artık örneklerle konuyu açıklayalım. Diyelim ki programın taramasını istediğimiz bir site var ve biz bu siteyi programa tanıtmak istiyoruz. Aşağıdaki menüden site ekle düğmesine tıkladığımızda :
karşımıza istediğimiz siteyi ekleyebileceğimiz bir yapı gelir:
Ürün linklerini arama kriteri kısmında bu bilgiyi elle girmelisiniz şeklinde bir uyarı var. Sebebi yaptığım bir kaç deneme sonucu tırnak (') karakterinin C# için özel bir karakter olmasından dolayı, veritabanına veri atarken sorun yaşamamdı. Çözmek için de çok uğraşmadım. Neyse, gerekli alanları doldurup, site ekle düğmesine bastığımızda arka planda gerçekleşen olaylar daha önemli:
private static OleDbConnection bag = new OleDbConnection();
bag.ConnectionString = spider.Properties.Settings.Default.linklerbag;
bag.Open();
OleDbCommand ekle = new OleDbCommand();
ekle.Connection = bag;
ekle.CommandText = "insert into siteler (anasayfa,regex2,regex3,tara) values ('" + textBox1.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','0')";
ekle.ExecuteNonQuery();
Evet, işte ilk verimizi veritabanımıza attık. Siteler tablomuzun anasayfa alanına, textbox1.text, regex2 alanına textbox3.text, regex3 alanına textbox4.text, tara alanına da 0 değerini atadık. Bunu yaparken yaptığımız işlemlere bakalım:
1) Öncelikle bir bağlantı tanımladık: OleDBConnection sınıfından türettiğimiz bag nesnesi.
2) Tanımladığımız bağlantının nereye bağlanacağını söyledik. Az önce bahsettiğim config dosyasındaki bağlantı metninin adının burda kullanıldığına dikkatinizi çekerim. Eğer config dosyasında böyle bir tanımlama yapmamış olsaydık, uzun uzun bağlantı metnimizi yazacaktık.
3) Komut sınıfından bir nesne tanımladık ve nereye bağlanacağını söyledik. OleDBCommand sınıfından türettiğimiz ekle nesnesi de bu işi görmektedir. Komuta nereye bağlanacağını belirtmezseniz, çalışma esnasında program hata verecektir.
4) Ekle nesnesinin çalıştıracağı sorguyu yazdık ve son olarak da Ekle.ExecuteNonQuery dedik. Böylece veritabanımıza ilk verimizi atmış olduk.
Tablomuza veriyi ekledikten sonra veriyi listelemeyi nasıl yaptığımızı da görelim.
private static OleDbConnection bag = new OleDbConnection();
bag.ConnectionString = spider.Properties.Settings.Default.linklerbag;
bag.Open();
OleDbCommand liste = new OleDbCommand();
liste.Connection = bag;
liste.CommandText = "select anasayfa,tara from siteler";
OleDbDataReader cek = liste.ExecuteReader();
while (cek.Read())
{
listBox1.Items.Add(cek[0].ToString());
if (cek[1].ToString().Equals("0"))
listBox2.Items.Add(cek[0].ToString());
else listBox3.Items.Add(cek[0].ToString());
}
Evet, ilk select sorgumuzu yazdık bile. Daha önce söylediğim gibi bir bağlantı tanımladık ve adına bag dedik. bag private static olarak tanımlandı çünkü aslında kendisi bir global değişken. Burda önemli nokta bag.connectionstring ibaresi. Az önce bahsettiğim config dosyasındaki bağlantı metnini burda kullanmış olduk. Liste adında bir tane komut nesnesi tanımladık. komut.connection = bag diyerek de tanımladığımız komutun nereye bağlanacağını, nereyi sorgulayacağını söylemiş olduk. cek adında bir okuyucu nesnesi tanımlayarak liste.executereader() fonksiyonu ile sorgu sonucu oluşan veriyi bu nesneye tanımlamış olduk.
Burda önemli olan veriyi nereye attığımız değil, veriyi nasıl aldığımız. Yani kilit isim OleDBCommand sınıfından türemiş olan liste nesnesi. "Select anasayfa,tara From Siteler" diyerek siteler tablosundaki tüm sitelerin anasayfa url'lerini ve taranıp taranmadıklarına işaret eden tara alanlarını alıp gelen bir sorgu yazdık ve bunu da liste.commandtext diyerek OLEDBCOMMAND nesnemize atamış olduk. OleDBcommand nesnesinin birden çok kullanışlı fonksiyonu vardır. Örneğin; liste.executeNonQuery diyerek, hiç bir veri dönüşünü beklemeyebilirdik. liste.executeDataset() diyerek sorgu sonucu oluşan veriyi bir datasete aktarabilirdik. keza liste.executeDatatable diyerek bir DataTable nesnesini sorgunun döndürdüğü veriyle doldurabilirdik.
Programda kullandığımız bir diğer Sql sorgusu da silmedir. Örnek olarak şunu verebiliriz:
OleDbCommand sil = new OleDbCommand();
sil.Connection = bag;
sil.CommandText = "delete * from gelen where ID ='" + url + "'";
sil.ExecuteNonQuery();
Bu sorgunun yaptığı iş de gelen tablosundan, ID'si belirtilen url olan kaydın silinmesidir. Where kısmından sonrasını yazmazsınız Sql size hiç birşey sormadan gelen tablosunu tamamen boşaltacaktır.
Programda kullandığımız bir komut değil de ama sql sorgusu olarak bir de update komutu var. Kullanımına örnek verecek olursak:
OleDbCommand guncelle = new OleDbCommand();
guncelle.Connection = bag;
guncelle.CommandText = "update gelen set ID = 'zburakguven.blogspot.com' where ID = '"+ url +"'";
guncelle.ExecuteNonQuery();
Update komutu da hepinizin bildiği gibi bir ve/veya birden fazla kaydı güncellemek için kullanılır. yukarıdaki sorgu ID'si belirtilen url olan bir kaydın değerini zburakguven.blogspot.com olarak değiştirmektedir. Where kısmından sonrasını yazmazsanız tüm ID alanı zburakguven.blogspot.com olarak değiştirilir.
Evet, veri işleme kısmını da bu şekilde anlatmaya çalıştıktan sonra geriye artık Thread yapımızı anlatmak kalıyor. Onu da en kısa zamanda yayınlamaya çalışacağım. Programın kodlarını isterseniz, yorum kısmına mail adresinizi bırakmanız yeterli. Son bölümde görüşünceye dek hoşçakalın...
C# ile Spider (Crawler - Web Örümcek) Örneği Bölüm 2: C# İle Access komutları
Gönderen z.burak güven zaman: 14:20
Etiketler: Programlama
Kaydol:
Kayıt Yorumları (Atom)
35 yorum:
ne kaynak kodları gönderebilirmisiniz teşekkürler.
Bi mail adresi bırakabilirseniz ben de size kaynak kodları yollarım. iyi çalışmalar...
webmaster.41 @ gmail.com
pardon yazmayı unutmusum.
teşekkür ederim. Beklediğimden de hızlı cevap verdiniz.
rica ederim. iyi çalışmalar...
bu kadar güzel kodları önce hazırlayan sonra derleyen daha sonra da biz isteyenlere yollayan burak arkadaştan bu kaynak kodları bana gönderirmisin muratorhan80 @ gmail .com bena da yollarsan sevinirm.
Arkadaşım çok sağol güzel anlatımın için bana da kodları gönderebilirmisin.
fatihkocak@hotmail.com
selam burak bey, ahmetay1987@gmail.com bana da gönderirseniz kaynak kodları sevinirim..
aktardığın verileri tekrar doğruluğunu veya yeni kayıt oluştuğunda tekrar eklediğin siteye uğrayarak tüm siteyi indeksleyerek mi işlemi gerçekleştiriyorsun. Bu işleve ait bildiğin algoritma veya yöntem var mı?
Açıkçası sorunuzu tam olarak anlayamadım. Ancak anladığım kadarıyla cevap vermeye çalışayım;
bir yandan site içinde gezinirken bulduğum her linki gezilecek linkler tablosuna atarken, diğer yandan gezdiğim her linki listemden temizleyip, gezdiklerim tablosuna atıyorum. Verinin doğruluğundan kastınız nedir tam olarak anlayamadım. İyi çalışmalar...
şu şekilde anlatayım. bir e-ticaret sitesine ait ürünleri regex'le aldığımı varsayıyorum. toplamda 200.000 ürün olsun. hazırladığımız bot veya crawler belli peryotlarla siteye uğrasın veya ben göndereyim önemli değil. her gittiğinde 200.000 veriyi tekrar mı çekecek? demek istediğim eldeki veriyle siteye son eklenen veriyi karşılaştırarak bu işlemi nasıl gerçekleştirecek.
Öncelikle uygulamanın çok kapsamlı bir uygulama olmadığını belirtmek isterim. Programı yazarken amacım sadece siteler içinde gezinebilen bir uygulama oluşturmaktı. Sorduğunuz soruya ilişkin bir çözüm uygulama içinde yok. Ancak nacizane çözüm için üç alternatif sunabilirim: Birincisi gezinilecek sitelerle anlaşmaya gidilip, ürünlerde güncelleme olup olmadığını kontrol etmek için veritabanı erişim izni almak (Sanmıyorum böyle bir şeye izin vereceklerini). İkincisi belirli zaman aralıklarıyla 200 bin ürünün belirlediğimiz özelliklerini tekrar dolaşmak. Farklılık varsa kendi veritabanımızda güncellemeler yapmak. En kolay çözüm son çözüm olurdu: Alışveriş sitelerinin ürünlerin güncelleme tarihlerini ürün sayfalarında bir yere dipnot olarak düşmesi. Böylece biz de kendi veritabanımıza bir güncelleme tarihi ekler ve sayfadaki tarihle karşılaştırırdık. Ancak örneğin hepsiburada.com'da böyle bir durum yok. Bu yüzden programın şu anki tasarımıyla yapılabilecek başka birşey yok. Ama bildiğim kadarıyla google bile 2 saatten 6aya kadar değişen zaman aralıklarında webdeki tüm sayfaları tekrar dolaşıyor. Dediğim gibi asıl amaç sitelerde dolaşan bir uygulama geliştirmekti. Bu sorunuz üzerine hiç kafa yormamıştım :) İyi çalışmalar dilerim...
Biliyorum yazdığınız örnek öğrenmek istediğim ve sorduklarımla bir ilgisi bulunmamakta. Ancak dikey arama motoru yazmaya çalışıyorum. Tek sorunum güncellemelerde. Regex üzerinden istediğim veriyi, aramayı gerçekleştirebiliyorum. max hız içinde tüm verileri alıp kendi veritabanıma aktarıyorum. Diğer yönden düşünerek aramayı kendi üzerindem gerçekleştirip sorgulamak istediğim değeri veri aldığım siteye göndererek alınan request e göre tekrar sitemde yayınlıyorum. Tahmin edeceğiz gibi bu işlem oldukça yavaş oluyor. Dikey arama motorları nasıl işlemler yapar nasıl geliştirilir vb. bilgilere ne yazık ki araştırmalarım sonucu bulamadım. Veya nereyi nasıl arayacağımı bilmediğimden kaynaklabilir.
Şahsi fikrimdir, uygulayıp uygulamamak size kalmış tabi ki: Bence tüm verileri tekrar alıp tekrar veritabanına yazmak daha doğru bir yaklaşım. Kendi veritabanınız üzerinden güncelleme yoluna giderseniz örümcek mantığından uzaklaşmış olursunuz. Sorguladığınız sitelere yeni linkler konulduğunda onları tarayamazsınız çünkü. Yapılabilecek bir şey anasayfadan dallanırken anasayfada bulduğunuz linkleri gruplamak. Böylece siteyi tekrar dolaşma işi biraz daha kolaylaşabilir. İyi çalışmalar dilerim...
bende kaynak kodları rica edebilir miyim?
afedersiniz mail adresimi yazmamışım. tanercat@gmail.com kaynak kodları rica ediyorum
enes.kabacaoglu {at} gmail adresine kaynak kodlarını gonderirseniz sevinirim. Kolaylıklar
konuyla çok alakalı değil ama içinde access veri tabanıda olan bi projeyi nasıl setup yaparız.Connection stringinde nasıl tasarlamalyız dosya yolunu program gömülü klasörde çalıştığında doğru çalışması için bi türlü beceremedim de şimdiden teşekkürler.
Merhabalar, öncelikle sorunuzu setup projesi hazırlamak başlıklı konuya sorsaydınız daha isabetli bir karar olurdu sanırım. Orda setup projesi hazırlamakla alakalı gerekli noktaları tek tek belirtmeye çalıştım zaten. buradan konuyla alakalı makaleye ulaşabilirsiniz. Bir de en azından mail aresinizi bıraksaydınız bu cevabın bi kopyasını da oraya gönderirdim. Daha iyi olurdu sanırım. Gelelim cevaba, setup projesi oluşturmakla ilgili makaleyi okursanız hangi dosyaların nereye atılacağını zaten az çok anlarsınız. Öncelikle bu makalede bulabileceğiniz üzere access veritabanınızı projeye dahil ettikten sonra, connection string olarak şunu yazabiliriz:
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\dosyaAdi.mdb"
Böylece oluşturduğunuz programın exe'si ile veritabanı dosyanız aynı klasörde olur. Setup hazırlarken bu oluşan (debug klasöründen bahsediyorum) klasörü komple setup içine sürükleyip bırakırsanız, bir sorun yaşayacağınızı sanmıyorum. Bunları yaptıktan sonra hala sorun yaşıyorsanız, ortaya çıkan problemle ilgili daha detaylı bilgi vermeniz lazım. İyi çalışmalar dilerim...
Öncelikle cevabınız için teşekkürler.Hocam benim problem biraz farklı galiba yazdığımız program visual studio ile AuoCAD üzerinde çalışan class library ile çalışıyor.Working directory dolayısı ile Autocad klasörü olmak zorunda.Setup yaptığımda ilgili mdb dosyası program files ta kendi setup klasörüme geliyor.Sizin dediğinzi gibi connection strinteki dosya yolunu yaptığımda hata ile karşılaşıyorum.Hata ilgili mdb dosyasının benim setup klasörümde değil de autocad klasöründe kurulu olması gerektiğini söylüyor. Sanırım yolu düzelterk yapu-ılır herhalde teşekkürler.İyi çalışmalar.
Merhaba Burak bey,
Kaynak kodları bana da gönderebilir seniz memnun olurum. kursatkutlu@live.com
Teşekkürler, başarılar.
selamlar burak bey
Kaynak kodları bende incelek isterim
kutlu_eren26@hotmail.com
teşekkürler
Öncelikle paylaşımınız için teşekkür ederim. Kaynak kodları banada göndermenizi rica ederim.
mail adresim lsahin@yahoo.com
Şimdiden teşekkürler.
mrb,öncelikle ellerinize sağlık cok güzel bi çalışma olmuşş,,kaynak kodlarınızı incelemek isterimm,,acil yollarsanız cok sevinirimm şimdiden teşekkürlerrr:):) the.sedebru.garden@hotmail.com cvb ınızı sabırsızlıkla bekliyormm:)
merhaba. web crawler bölüm 2'nin de kaynak kodları gönderirseniz sevinirim. netsinan(at)gmail.com
Eline sağlık güzel bir çalışma bende bu konuyu alakalı bir proje geliştirmek istiyorum rica etsem Crawler ile ilgili örnek kodları gönderirmisin (C# ile Spider Crawler - Web Örümcek Örneği Bölüm 1,2,3)
furukoleo@hotmail.com
...
dostum kaynak kodları bana da gönderebilirmisin. teşekkürler. oguzhan1981@gmail.com
Merhabalar;
simaozbilen@hotmail.com adresine de kaynak kodu gönderebilirmisiniz.
İyi çalışmalar..
nagundogdu@hotmail.com
Kaynak kodları yollarsanız çok sevinirim,iyi çalışmalar.
öncelikle elinize sağlık.. kaynak kodlara ben de bakmak isterim.. en yakın zamanda ulaşır umarım , kolay gelsin.. gulaydinyildirim@gmail.com
barisnet@hotmail.com
bu tarz bir uygulama üzerinde calısıyorum kodları gonderebilirseniz sevinirim.
biraz geç oldu ama bende alabilir miyim kodları..teşekkürler
onur_sagiroglu2011@otmail.com
Hocam Merhaba,
Yazınız gerçekten çok faydalı oldu. Çok teşekkür ederim. Bir hayli süre geçmiş üzerinden ama mozkarakoc@gmail.com adresine kaynak kodları alabilir miyim?
rica etsem kodlarınızı banada yolalrmısınız
cenkolmez@mynet.com
Merhaba, Ben de yazınızı yeni gördüm ve üzerinden bir hayli süre geçmiş. Mümkünse sodeven@gmail.com adresine kaynak kodları gönderebilirmisiniz? Teşekkürler.
Yorum Gönder