duranforreal

Üstün
Katılım
30 Nisan 2024
Mesajlar
1.620
Çözümler
3
Beğeniler
1.015

Giriş

İyi günler Forum. Bugün sizlere C# kullanarak nasıl Web sitesinden veri çekebilirsiniz onu göstereceğim. Bu kütüphane Web sitesinden veri çekmek (web scraping) yapmak için en kolay, en kavranabilir, makineyi en az yoran yöntem olduğunu düşünüyorum.​

Nedir Bu AngleSharp?

AngleSharp, HTML, SVG ve MathML gibi açılı parantez tabanlı hiper metinleri ayrıştırmanıza olanak tanıyan bir .NET kütüphanesidir. Web scraping yaparkende bu kütüphaneyi kullanıyoruz.​

Neden AngleSharp?

Nedenmi AngleSharp? Çünkü, bu kütüphane web scraping yaparken makinamızın kaynağını en az kullanan, kod yazarkende en az satır kullanarak en fazla verimi veren kütüphane olduğunu düşündüğüm için bu kütüphaneyi tercih ettim.​

Peki AngleSharp'ı Nasıl Edinirim?

AngleSharp'ın NuGet paketini projenize eklemek için;
1: .csproj dosyanızın bulunduğu klasöre gelin
2: Dosya gezgininde bulunan adres çubuğuna gelin ve oraya "cmd" yazın
3: ve cmd'ye "dotnet add package AngleSharp --version 1.4.0" komutunu yapıştırın
Ve işlem tamam Anglesharp'ın NuGet paketini projenize eklediniz!​

Bir Web Sitesinin Başlığını Çekmek!

Evet geldik ilk yapacağımız web scraping'e bir web sitenin başlığını çekeceğiz!
Evet dediğim gibi bunu AngleSharp'la yapmak çok kolay. AngleSharp bizim yerimize siteye girer istediğimizi alır geri gelir.
Peki bunu nasıl yapacağız? Örnek bi konsol uygulaması;
C#:
using System;
using AngleSharp;
using AngleSharp.Common;
using AngleSharp.Dom;

namespace ConsoleApp1
{
    class Program
    {
       
static IConfiguration config = Configuration.Default.WithDefaultLoader();
        static IBrowsingContext context;
        static IDocument document;
        static async Task Main(string[] args)
        {
            Console.Clear();
           context = BrowsingContext.New(config);
           await BaslikCek("https://techolay.net/sosyal");
           await DolarCek();
        }
        static async Task BaslikCek(string site)
        {
            document = await context.OpenAsync(site);
            Console.WriteLine("Site basligi: " + document.Title);
        }
    }
}
Bu kod adresini yazdığımız Web sitenin başlığını alıp konsola yazdıracaktır.
Evet AngleSharp'da bi Web sitesinin başlığı çekmek bu kadar kolay. Fakat Techolay'da Cloudflare robot doğrulaması olduğu için orayı geçemeyip başlığa "Just a Moment..." yazıyor.
1768077668588.webp

Bir Web Sitesinden Yazı Çekmek!

Evet bu seferde Web sitesinden yazı çekeceğiz. Örnek olarak BigPara'dan Dolar alış fiyatını çekeceğiz.
Örnek bi C# metotu (önceki konsol uygulamasıyla kullanılabilir);
C#:
static async Task DolarCek()
        {
            document = await context.OpenAsync("https://bigpara.hurriyet.com.tr/doviz/dolar/");

            var dolar = document.QuerySelector("span.value.up");

            Console.WriteLine(dolar.TextContent.Trim() + " Dolar Alis Fiyati");
        }
1768328463784.webp

Bir Web Sitesinden Görsel Çekmek!

Evet bu seferde Web sitesinden görsel çekeceğiz. Örnek olarak Vikipedi'den "haftanın seçkin maddesi" görselini çekeceğiz.
Örnek bi WPF uygulaması;
XML:
<Window x:Class="AngleSharpResimCekme.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:AngleSharpResimCekme"
        mc:Ignorable="d"
        Background="Black"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel Margin="20">
            <Button x:Name="btnResimCek" Content="Resmi Getir" Click="btnResimCek_Click" Height="30"/>
            <Image x:Name="imgGosterici" Height="300" Margin="0,20,0,0" Stretch="Uniform"/>
            <TextBlock x:Name="txtDurum" TextAlignment="Center" Margin="5"/>
        </StackPanel>
    </Grid>
</Window>
C#:
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Common;

namespace AngleSharpResimCekme
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void btnResimCek_Click(object sender, RoutedEventArgs e)
        {
            string siteUrl = "https://tr.wikipedia.org/wiki/Anasayfa";

            try
            {
                var config = Configuration.Default.WithDefaultLoader();
                var context = BrowsingContext.New(config);
                var document = await context.OpenAsync(siteUrl);

                // Google'ın logosunu bulalım
                var resimElementi = document.QuerySelector("img.mw-file-element");

                if (resimElementi != null)
                {
                    string resimUrl = resimElementi.GetAttribute("src");

                    if (resimUrl.StartsWith("//"))
                    {
                        resimUrl = "https:" + resimUrl;
                    }

                    BitmapImage bitmap = new BitmapImage();
                    bitmap.BeginInit();
                    bitmap.UriSource = new Uri(resimUrl, UriKind.Absolute);
                    bitmap.CacheOption = BitmapCacheOption.OnLoad;
                    bitmap.EndInit();

                    imgGosterici.Source = bitmap;
                    txtDurum.Text = "Resim başarıyla yüklendi!";
                }
                else
                {
                    txtDurum.Text = "Resim bulunamadı!";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Hata: " + ex.Message);
            }
        }
    }
}
1768332037446.gif

Sonuç

Evet, AngleSharp ile bunları yapabiliyorsunuz ben bu kadarını biliyorum ve daha fazlası yapılabilir.
Bu kütüphane C# ile web scraping'in en basit hali olduğunu düşünüyorum ve düşündüğüm için size tanıtmayı düşündüm.
Peki siz ne düşünüyorsunuz? yorumlarınızı bekliyorum.
Okuyup zaman ayırdığınız için teşekkür ederim.​