Goutte, Symfony bileşenlerine dayanan bir web tarayıcısı ve web scraping kütüphanesidir. Laravel projelerinde kullanımı oldukça kolaydır. Örnek bir kod ile Goutte kullanımını anlatalım:

Goutte’u Laravel projenize eklemek için öncelikle Composer’ı kullanarak Goutte paketini projenize eklemeniz gerekmektedir. Terminal veya komut isteminde aşağıdaki komutu çalıştırın:

composer require fabpot/goutte

Bu komut, Goutte paketini projenize ekleyecektir.

Laravel’de Goutte’u kullanmak için, Composer’ın autoload dosyasına dahil etmeniz gerekmektedir. Bunun için, config/app.php dosyasında providers dizisi içine aşağıdaki satırı ekleyin:

'Goutte\GoutteServiceProvider',

Ayrıca, aynı dosyanın aliases dizisi içine de aşağıdaki satırı ekleyin:

'Goutte' => 'Goutte\Client',

Bu işlemleri yaptıktan sonra, Goutte’u Laravel’de kullanmaya hazırsınız. Örneğin, bir controller içinde şu şekilde kullanabilirsiniz:

use Goutte\Client;
public function scrape()
{
    $client = new Client();
    $crawler = $client->request('GET', 'https://www.example.com');
    $title = $crawler->filter('h1')->text();
    $description = $crawler->filter('.description')->text();
    return view('scraped', [
        'title' => $title,
        'description' => $description,
    ]);
}

Haber sitesindeki haberleri almak için Goutte kullanarak benzer bir senaryo oluşturabilirsiniz. Örneğin, belirli bir haber sitesinden tüm haber başlıklarını ve içeriklerini almak istediğinizi varsayalım.

İlk adım olarak, haber sitesinin URL’sini belirleyin ve Goutte’u kullanarak sayfanın içeriğini çekin:

$client = new Client(); 
$crawler = $client->request('GET', 'https://www.example.com/haberler');

Daha sonra, haberlerin listelendiği bölümü seçmek için CSS seçicisini kullanın:

$haberler = $crawler->filter('.haber-listesi')->children();

Bu, .haber-listesi sınıfına sahip bir HTML öğesi içindeki tüm çocuk öğeleri seçecektir. Daha sonra, $haberler değişkeni üzerinde each metodunu kullanarak her haber için işlem yapabilirsiniz. Örneğin, haber başlıklarını ve içeriklerini alabilirsiniz:

$haberler->each(function ($haber) {
    // Haber başlığı
    $baslik = $haber->filter('.haber-baslik')->text();
    // Haber içeriği
    $icerik = $haber->filter('.haber-icerik')->text();
    // Haber tarihi
    $tarih = $haber->filter('.haber-tarih')->text();
    // Haber kategorisi
    $kategori = $haber->filter('.haber-kategori')->text();
    // Haber yazarı
    $yazar = $haber->filter('.haber-yazar')->text();
    // Haber görüntüsü
    $gorsel = $haber->filter('.haber-gorsel img')->attr('src');
    // Haber URL'si
    $url = $haber->filter('.haber-baslik a')->attr('href');
    // Alınan bilgileri kullanarak işlem yapabilirsiniz
    // Örneğin, haberleri veritabanına kaydedebilirsiniz
});

Bu kod, her haber öğesi için başlık, içerik, tarih, kategori, yazar, görüntü ve URL gibi bilgileri alacaktır. Daha sonra, alınan bilgileri kullanarak istediğiniz işlemi yapabilirsiniz.

Chrome’da CSS seçicilerini bulmak için aşağıdaki adımları izleyebilirsiniz:

  1. İncelemek istediğiniz sayfayı açın.
  2. Chrome’un üst sağ köşesindeki üç nokta simgesine tıklayın ve “Geliştirici araçları” seçeneğini seçin.
  3. Açılan Geliştirici Araçları panelinde, sayfada incelemek istediğiniz öğenin üzerine tıklayın.
  4. Sol panelde, seçilen öğenin kodunu göreceksiniz. Burada, seçiciyi bulmak istediğiniz öğenin HTML kodu yer alır.
  5. Seçiciyi bulmak için, sağ taraftaki “Elements” sekmesinden istediğiniz öğenin üzerine tıklayın.
  6. Seçili öğenin stil özellikleri, altındaki “Styles” sekmesinde görüntülenir. Burada, öğenin hangi CSS özellikelerine sahip olduğunu görebilirsiniz.
  7. Seçiciyi bulmak için, CSS kodunda ilgili öğeye tıklamanız yeterlidir. Bu, sol taraftaki HTML kodunda ilgili öğenin seçicisinin vurgulanmasını sağlayacaktır.
  8. Seçicinin tamamını kopyalamak için, sağ tıklayın ve “Copy selector” seçeneğini seçin.

Bu adımları izleyerek, Chrome’da CSS seçicilerini bulabilir ve kopyalayabilirsiniz.

Laravel Goutte paketi kullanarak aldığınız içerikteki linkleri silmek için, Goutte’nin sunduğu filterXPath() metoduyla XPath ifadeleri kullanabilirsiniz. Örneğin, aşağıdaki kod örneğinde, $filteredContent değişkeni içinde saklanan içerikteki tüm linklerin silinmesi gösterilmiştir:

use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://www.example.com/');
$content = $crawler->filter('body')->text();
$filteredContent = $crawler->filterXPath('//a')->each(function ($node) use ($content) {
    return str_replace($node->text(), '', $content);
});
echo $filteredContent;

Bu örnekte, $content değişkeni, belirtilen URL’den alınan içeriği filter() metodu ile filtreleyerek elde ediyoruz. Daha sonra, $filteredContent değişkeni içinde, XPath ifadesi //a ile belirtilen tüm linklerin içeriği str_replace() fonksiyonu ile boş bir dizeyle ('') değiştiriliyor. Son olarak, echo komutu ile $filteredContent değişkeninde saklanan içerik ekrana yazdırılıyor.

Bu şekilde, aldığınız içerikteki tüm linkleri filtreleyebilir ve sadece metin içeriğini elde edebilirsiniz. Ancak, bu yöntemle içerikteki tüm linklerin silinmesi, bazı durumlarda istenmeyen sonuçlara sebep olabilir. Örneğin, içeriğin yapısı bozulabilir veya sayfa içindeki önemli bağlantılar kaybolabilir. Bu nedenle, içeriğinizi filtrelerken dikkatli olmanız önemlidir.

Tabii ki, bu örnekte kullanılan CSS seçicileri haber sitesine göre değişecektir. Ancak, bu örnek sizin için bir başlangıç noktası olabilir. Goutte, web scraping senaryolarını oluşturmak için oldukça güçlü bir araçtır.

Shares:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir