Website Örümceği -1

Merhaba.
Yıllardır boşladığım blogumdan herkese merhaba.
Bu yazımda size arkadaşımın isteği üzerine hazırladığım bir web site örümceği; yani bir siteden veri çeken yazılımın anlatımı ve kaynak kodlarını anlatacağım.
Sitemiz Giresun Valiliği'nin sitesi. Çekilecek veriler de tüm haberler.
Yani programımız da özel bir örümcek olacak.
Hazırsanız başlıyorum. :)
Sitede 800+ haber 70+ sayfaya yayılmış durumda.
http://www.giresun.gov.tr/tum-haberler
Aynı zamanda sitenin tasarımını yapan kardeşlerimiz bu haberleri ayrı ayrı sayfalarda tutmak yerine, link aynı sayfada sabit dururken haberleri veri tabanından 10'ar 10'ar çekmeyi uygun görmüşler.
Bu sebeple verileri çekmeden önce tüm haberleri tek bir sayfada toplamak işimizi kolaylaştıracak.

--- Burada, github'aki "beni oku" dosyasından yönergeleri aynen alıyorum.---

Bunu yapabilmek zor değil. Yazılı anlatımı zor ama uygulaması saniyeler alıyor.
(Yönergeler Chrome içindir)
1.  http://www.gumushane.gov.tr/haberler
2.  Tüm haberlerde ikinci sayfaya tıklayın.
3.  Birinci sayfanın butonuna sağ tıklayın
4.  "Ogeyi denetle" veya "İncele" seçeneğine tıklayın (F12) 
5.  "a href="/ISAYWebPart/ElegantNewsList/ElegantNewsList?
page=1&ContentTypeId=5QkKkVy8Dxx1LllllxMcQw%3D%3D&OrderByAsc=True&ContentCount=9&Width=100&TextColor=%233c3c3c&LinkHoverColor=%23d29939&PagerColor=%233c3c3c&PagerHoverColor=%23d29939&AddImage=True&AddSummary=False&AddPager=True&AddYear=False
style="color: rgb(60, 60, 60); border-color: rgb(60, 60, 60);"
Üsttekine benzer birinci sayfa linkini bulun.
6.  Sağ tıklayıp Edit as HTML tıklayın (F2) 
7.  ContentCount=9 kısmını ContentCount=1000 gibi büyük bir sayı ile değiştirin.
8.  Değişiklikleri kaydetmek için tekrar (F2) ye basın ya da herhangi bir alana tıklayın.
9.  F12 ile ya da ögeyi denetlenin köşesindeki çarpıya basarak kapatın.
10. Değiştirdiğiniz birinci sayfa düğmesine basın.
11. Haberler geldiyse CTRL+S veya sağ tık farklı kaydet yaparak istediğiniz bir yere kaydedin.
--- Bundan sonrası programı açıp .çalıştırdıktan sonraki bölüm ---
12. Programı çalıştırıp html dosyasını içe aktarın. (Program size yol gösterecektir.)
13. Form2'ye taşı'ya tıklayın.
14. Açılan pencerede haberlerin bulunduğu metin dosyasının nereye kaydedileceğini seçip Getir düğmesine basın. -SON-
Yine de olmazsa diye Tumhaberler.html dosyasını ekledim. Bu HTML dosyası ile 1000 habere kadar çekebilirsiniz.

Programın hazırlanışı:
(Tasarım yönergeleri benimkine göre)
Öncelikle Visual Studio'daki projenize 2 adet form ekleyin.
İlk forma 1 adet openfiledialog, 1 adet savefiledialog, 4 adet button ve 1 adet richtextbox ekleyin.
2. forma ise 1 adet savefiledialog, 1 adet folderbrowserdialog, 1 adet listbox, 1 adet richtextbox ve 2 adet buton ekleyin.

Şimdi Visual Studio'da üstteki menüde sırasıyla
Proje Yöneticisi - NuGet Paketlerini Yönet
Burada Gözat bölümünden HTML Agility Pack'i indirip kurun.
https://htmlagilitypack.codeplex.com/
Yükledikten sonra
using HtmlAgilityPack;
usinge ekleyin.
Html dosyasını almak için:

string DosyaYolu;
OpenFileDialog dosya = new OpenFileDialog();
dosya.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//Burada ben html dosyalarını masaüstüne kaydettiğim için kolaylık açısından diyalog açılışında //masaüstünü göstermesini istedim. (Sağ olsun kırmadı beni) Siz de buraya istediğiniz klasörü //yazabilirsiniz. buradaki bir diğer özellik ise programı başka bir bilgisayarda çalıştırdığımızda
//da diyalog açılışında o kullanıcının masaüstünü gösterebilmesi.  (GetFolderPath içine C:\Users\kullanici\Desktop biçiminde bir dosya yolu yazılmadığı için)
dosya.Filter = "Html dosyaları |*.html";
dosya.RestoreDirectory = true;
dosya.Title = "Html dosyası seçiniz";
dosya.ShowDialog();
DosyaYolu = dosya.FileName;

Html ayıklama bölümü:

WebClient client = new WebClient();
string html = client.DownloadString(DosyaYolu);
//Adresten istek yapı html kodlarını indiriyoruz.
HtmlAgilityPack.HtmlDocument dokuman = new HtmlAgilityPack.HtmlDocument();
dokuman.LoadHtml(html);

HtmlNodeCollection basliklar2 = dokuman.DocumentNode.SelectNodes("//h2");
//burada da etiketi h2 olanları alıyoruz.
List liste = new List();
/burada bir liste<> tanımladık.
var doc = new HtmlAgilityPack.HtmlDocument();
foreach (var baslik in basliklar2)
{
int hayri = baslik.InnerHtml.Length - 4;
int sayi = baslik.InnerHtml.IndexOf("\">");
string metin = baslik.InnerHtml.Substring(9, sayi - 11);
//Burada linkin richtextboxta doğru görüntülenmesini sağlıyoruz.
//Linkin başında ya da sonunda eksik veya fazla karakter varsa bu sayıları değiştirerek kendi çözümünüzü üretebilirsiniz.
liste.Add(metin.Substring(0, metin.Length - 44) + "\n");
//Parse ettiğimiz linklerin üzerinde yazan yazılar dizi halinde listeye ekleniyor...
}

for (int i = 0; i < liste.Count; i++)
{
richTextBox1.Text += liste[i];
}
MessageBox.Show(liste.Count.ToString());

Elde ettiğimiz linkleri bir metin dosyasına almak için (isteğe bağlı bir bölüm):

if (richTextBox1.Text != "")//boş değil ise işlem yap
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Text dosyası |*.txt";
saveFileDialog1.Title = "Dışa Aktar...";
saveFileDialog1.ShowDialog();
StreamWriter sw = File.CreateText(saveFileDialog1.FileName);
sw.WriteLine(richTextBox1.Text);
//satır satır yazılıyor burada.
sw.Flush();
sw.Close();
}
else
{
MessageBox.Show("Lütfen linkleri çekiniz.");
button1.PerformClick();
//boş richtextboxtan (rtb) veri çekmeye çalışılmasın diye bir kontrol ve eğer rtb boş ise html seçme penceresini açan button kodları.
}

İlk bölümün sonuna geldik. İlk aşamada sorularınız olursa yorum kısmından ya da google'a boheminsan yazarak diğer kod kısımlarına https://github.com/Boheminsan/valilikhaber
adresinden erişebilirsiniz. Kodları Visual Studio sürümlerinden bağımsız hale getirdim. Hangi sürümde açmak isterseniz isteyin yapmanız gereken o sürümde iki formu olan bir proje oluşturmak. Daha sonra da benim yazdığım dosyaların tamamını proje klasörüne atmak. 2005-2008 kullanıyorsanız açılıp açılmayacağını bilemiyorum. Ben 2015 ve 2017 (ikisi de Community)'de denedim.

Yazılımla kalın.

Yorumlar

Popüler Yayınlar