JavaScript ile Web’den Veri Çekme (Web Scraping)
Merhaba, bir süredir javascript ve node teknolojileriyle ilgileniyorum. Npm (Node Package Manager)’i incelerken çok güzel bir paket gördüm ve denedim. Sizle de paylaşmak istedim. Paketimizin adı Cheerio. Evet, cheerio ile Web Scraping gerçekten çok pratik. Ufak bir denememi sizle paylaşmak istiyorum. Öncelikle Cheerio ‘yu ve request paketlerini kuralım.
npm install cheerio request –save
Komutunu konsola yazarak cheerio ve request paketlerini kuruyoruz. Tabi, node’un bilgisayarınızda kurulu olması gerekiyor. Daha sonra editörümüzü açıyoruz ve app.js oluşturuyoruz.
İlk önce paketlerimizi dahil ediyoruz.
var request = require('request');
var cheerio = require('cheerio');
Ben ide olarak Vs Code kullanıyorum. Daha sonra request paketimizi kullanarak veri çekmek istediğimiz siteyi giriyoruz. ben Amatorfutbol.org sitesinden, Samsun amatör kümedeki maçları çekmek istedim.
request('http://www.amatorfutbol.org/askf/samsun/super-amator/puandurumu-5810.html',(error,response,html)=>{
if(!error && response.statusCode==200){
........
}
}
Evet. gerekli url i giriyoruz ve response 200 koduyla dönüp herhangi bir hata görmediğimiz sürece kod blogunu doldurmaya başlıyoruz.
var $=cheerio.load(html);
$('table#program tr.hucre').each(function (i,el){
var metadata=
{
tarih: $(this).find('td').slice(0,1).text(),
saat: $(this).find('td').slice(1,2).text(),
yer: $(this).find('td').slice(2,3).text(),
evsahibi: $(this).find('td').slice(4,5).text(),
konuk: $(this).find('td').slice(6,7).text(),
sonuc: $(this).find('td').slice(5,6).text()
};
console.log(metadata);
Kodlardan bahsetmem gerekirse. $ değişkenine html sayfasını load ettikten sonra JQuery seçicilerine benzer bir şekilde program id’li tabloyu seçip içindeki hucre class lı tr’leri çekiyorum. ve her biri üzerinde each fonksiyonuyla işlem yaptırmak istiyorum. 6 satır tr buluyor. ben her tr nin içindeki td leri find fonksiyonuyla arıyorum ve slice fonksiyonuyla keserek metadata değişkenine json verisi gibi atıyorum,
{ tarih: '20/01/2019',
saat: '13:30',
yer: 'Vezirköprü İlçe Sahası',
evsahibi: 'Vezirköprü Belediyespor',
konuk: 'Samsun Yolspor',
sonuc: '0 - 1' }
{ tarih: '20/01/2019',
saat: '13:30',
yer: 'Bafra İlçe Stadı',
evsahibi: 'Hacınabispor',
konuk: '1930 Bafraspor',
sonuc: '1 - 3' }
{ tarih: '20/01/2019',
saat: '13:30',
yer: 'Samsun 19 Mayıs Yan Saha',
evsahibi: '19 Mayıs Belediyespor',
konuk: 'Samsun İlkadım YAB-PA',
sonuc: '5 - 3' }
{ tarih: '20/01/2019',
saat: '14:00',
yer: 'İlkadım İlçe Sahası',
evsahibi: 'Samsun Türk Telekom',
konuk: 'Termespor',
sonuc: '1 - 3' }
{ tarih: '20/01/2019',
saat: '14:00',
yer: 'Dikbıyık Enver Yıldırım Stadı',
evsahibi: 'Tekkeköyspor',
konuk: 'Atakum Belediyespor',
sonuc: '1 - 3' }
{ tarih: '20/01/2019',
saat: '14:00',
yer: 'Samsun Suni Çim Saha',
evsahibi: 'Sporland Bahçelievlerspor',
konuk: 'Karasamsunspor',
sonuc: '1 - 2' }
Ekran çıktısına ulaşıyorum.Kodların tamamı ise şu şekilde oluyor:
var request = require('request');
var cheerio = require('cheerio');
request('http://www.amatorfutbol.org/askf/samsun/super-amator/puandurumu-5810.html',(error,response,html)=>{
if(!error && response.statusCode==200){
var $=cheerio.load(html);
$('table#program tr.hucre').each(function (i,el){
var metadata=
{
tarih: $(this).find('td').slice(0,1).text(),
saat: $(this).find('td').slice(1,2).text(),
yer: $(this).find('td').slice(2,3).text(),
evsahibi: $(this).find('td').slice(4,5).text(),
konuk: $(this).find('td').slice(6,7).text(),
sonuc: $(this).find('td').slice(5,6).text()
};
console.log(metadata);
});
}
});
Çalıştırmak için tabiki
node app.js
Kullanıyoruz. Daha detaylı bilgi için cheerio’yu github‘da ziyaret edebilir, detaylı dökümantasyonu okuyabilirsiniz.
hocam bunu biraz kendime uyarladım:
var metadata=
{
gün: $(this).find(‘.day’).slice(0).text(),
ay: $(this).find(‘.month’).slice(0).text(),
duyuru: $(this).find(‘a’).slice(0).text()
};
ama çıktısında gün tırnak içinde geliyor. neden acaba?