Merhabalar
;
Bugün
bir web sitesinden resim çeken ve onları indiren bir bot yapacağız.
Kodumuzun daha düzenli olması ve hatalara kolay müdahele
edebilmemiz için de class yapısını kullanacağız. Yazacağımız
class resim dosyalarını ayrıştıracak, bir sonraki sayfanın
linkini verecek ve resimleri indirecek. Yani üç metodu olan çok
basit bir class olacak. Php'ye yeni başlayanlar için de class
yapısının temellerini görebilmek adına faydalı olacağını
düşünüyorum böyle bir yapının. Bir şeyi daha hatırlatmak
isterim. Gireceğimiz sitedeki resimleri toplamak için bir emek
harcanmış ve biz de bu emeğe saygısızlık yapmak istemiyoruz.
Onun için kaynak belirtmeden resimleri kullanmayalım lütfen.
Resimlerini
indireceğimiz site “http://firstknownwhenlost.blogspot.com/
”. İçerisinde bir sürü birbirinden güzel resim mevcut. Yine
anlatacaklarım chrome tarayıcısı için. Tabi ki diğer
tarayıcılar için de benzer fonksiyonlar mevcut. Öncelikle
sayfanın içindeki herhangibir resmin üzerine gelip, sağ tuşa
basıp “öğeyi denetle” yapıyoruz.
Sonra
resmin kaynak kodun içerisinde kendisini belli eden bir yer
arıyoruz. Tabi CTRL-U yaparak sayfa kaynağını görmek her zaman
için daha faydalıdır.
Resim
için kaynak kod:
<div
class="separator" style="clear: both; text-align:
center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPXrs0QeriRgXvEh40ouiMzmOtzjxlo6IWZsA74bLtg_8bNsF4kJRhysolqtHNyxnyoPeSuc9foJSzSQE2uD0F7LUO4GYV0RSh5yt5Ar_NGEXrlBoDFnVcveF93s2UClTd8Kb1Ojbg2qS/s1600/autumn-landscape-at-goulazon-1900.jpg!Blog.jpg"
imageanchor="1" style="margin-left: 1em; margin-right:
1em;"><img border="0" height="315"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPXrs0QeriRgXvEh40ouiMzmOtzjxlo6IWZsA74bLtg_8bNsF4kJRhysolqtHNyxnyoPeSuc9foJSzSQE2uD0F7LUO4GYV0RSh5yt5Ar_NGEXrlBoDFnVcveF93s2UClTd8Kb1Ojbg2qS/s400/autumn-landscape-at-goulazon-1900.jpg!Blog.jpg"
width="400"></a></div>
bu
şekilde. Şimdi biz resimleri Orijinal boyutunda almak istiyoruz.
Bildiğiniz gibi resimler sitelere yüklenirken sayfa görüntüsünü
bozmamak için boyutu değiştirilerek konulur. <img> ...</img>
tagleri arasında kalan bölüm sayfa içerisinde göründüğü
boyut, <a>...</a> tagleri içerisinde kalan bölüm ise
orijinal boyut. İki tag arasına da baktığımızda göze ilk
çarpan farklılık s1600 ve s400 belirteçleri. Bu da işimizi son
derece kolaylaştırıyor. Orijinal boyutu almak için bir düzenli
ifade yazmak istersek:
“/http:\/\/(.*?)s1600(.*?)\.jpg/i”
ifadesi bizim için yeterli olacaktır.
Demek
istiyoruz ki
string
http:// ile başlasın , sonra link'in ilk bölümü gelsin ,
arkasından stringin herhangi bir yerinde s1600 görelim, yine devam
etsin ve .jpg ile bitsin. Bunu preg_match_all içerisinde kullanarak
resimleri alıyoruz.
Geriye
bir sonraki sayfanın linkini almak kalıyor. Bunun için yine “older
post” linki üzerine sağ tuş ile gelerek kaynak kodu alıyoruz.
Bu
da :
<span
id="blog-pager-older-link">
<a
class="blog-pager-older-link"
href="http://firstknownwhenlost.blogspot.com/search?updated-max=2012-10-01T00:10:00-07:00&max-results=8"
id="Blog1_blog-pager-older-link" title="Older
Posts">Older Posts</a>
</span>
burası
için de “@<a class=\'blog-pager-older-link\'
href=\'(.*?)\'(.*?)</a>@si“ regexini kullanarak bir sonraki
sayfanın linkini alıyoruz. Bunları ne şekilde kullanacağımızı
anlatmama gerek yok sanıyorum. Sayfanın altında kaynak kodu
görebilirsiniz zaten.
En
sonunda copy() fonksiyonu ile resim linkini ve kopyalanacak yeri
belirleyip resimleri indiriyoruz. Ancak tekrar belirtiyorum, bu
resimleri kaynak göstermeden kullanmayalım ki saygısızlık
olmasın.
Görüşmek
üzere..
Kaynak Kodlar:
classes.php:
<?php
/* Webpage class -> */
class webpage
{
public $URL;// sitenin adresi
private $source; //kaynak kodu (string veya false)
public $images; //icindeki resimler array cinsinden
private $id;
function webpage($url,$kaynak,$page_id)
{
$this->images=array();//bos bir array actik
$this->source=$kaynak;
$this->id=$page_id;
$this->URL=$url;
}
/*bu fonksiyon tum resimleri $images icerisine koyacak*/
public function get_images()
{
$data=$this->source;
preg_match_all('/http:\/\/(.*?)s1600(.*?)\.jpg/i',$data,$temp);
//var_dump($temp);
$this->images=$temp[0]; //images ->> array
//var_dump($this->images);
}
/* Kendisinden bir sonraki sayfanin link'ini verir*/
public function next_page()
{
$data=$this->source;
/*
Older Posts
*/
preg_match_all('@@si',$data,$temp);
//var_dump($temp);
return $temp[1][0]; //bir sonraki sayfanin linki
}
public function download()
{
$image_id=0;
foreach($this->images as $the_image)
{
$file_name=$this->id."_".$image_id.".jpg";
copy($the_image,"images/".$file_name);
$image_id++;
}
}
}
?>
index.php:
<?php
include("classes.php");
$link='http://firstknownwhenlost.blogspot.com/';
$data=file_get_contents($link);
$num_pages=2; //kac sayfayi ziyaret edecegiz
for($p=0;$p<$num_pages;$p++)
{
$the_webpage=new webpage($link,$data,$p);
$the_webpage->get_images();
$the_webpage->download();
$link=$the_webpage->next_page();
$data=file_get_contents($link);
}
?>

Hiç yorum yok:
Yorum Gönder