17 Ekim 2012

Php bot ve download


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&amp;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:






&lt?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