Advertisement
Guest User

Crawler de AirBNB

a guest
Feb 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.04 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Services;
  4.  
  5.  
  6. use App\Entity\Hotels;
  7. use App\Entity\ImagesHotels;
  8. use GuzzleHttp\Client;
  9. use Symfony\Component\DomCrawler\Crawler;
  10. use Symfony\Component\Filesystem\Filesystem;
  11.  
  12. class AirBnbCrawler{
  13.  
  14.     /** @var $crawler Crawler */
  15.     protected $crawler;
  16.  
  17.     protected $dataCrawler;
  18.     protected $imgCrawler;
  19.     protected $em;
  20.  
  21.  
  22.     public function __construct(EntityManager $em)
  23.     {
  24.         $this->em = $em;
  25.     }
  26.  
  27.     protected function getCrawler($link)
  28.     {
  29.         $client = new Client();
  30.         $raw = $client->get($link);
  31.  
  32.         $this->crawler = new Crawler($raw->getBody()->getContents());
  33.  
  34.         $this->dataCrawler =($this->crawler->filter('._czm8crp')->each(function (Crawler $node){
  35.             if (strpos($node->text(),'huéspedes')!== false || strpos($node->text(),'dormitorios')!== false || strpos($node->text(),'baños')!== false  )
  36.                 return $node->text();
  37.         }));
  38.  
  39.         $this->imgCrawler = $this->removeNull(($this->crawler->filter('img')->each(function (Crawler $node){
  40.             if (strpos($node->attr('src'),'base64')=== false )
  41.                 return $node->attr('src');
  42.         })));
  43.     }
  44.  
  45.     protected function removeNull($array)
  46.     {
  47.  
  48.         $data = [];
  49.         foreach ($array as $item) if (!is_null($item)) $data[] = $item;
  50.  
  51.         return $data;
  52.     }
  53.  
  54.  
  55.     protected function getData($element)
  56.     {
  57.         $data = [];
  58.         foreach ($this->dataCrawler as $item) if (strpos($item,$element) !== false) $data[] = $item;
  59.  
  60.         if(count($data) > 0) $data = explode(' ',array_pop($data));
  61.  
  62.         return ($data > 0) ? $data[0] : 0 ;
  63.     }
  64.  
  65.     protected function getPathImg(Hotels $hotel)
  66.     {
  67.         $url = 'images\\hotels\\'.$hotel->getSlug().'\\';
  68.         $fs = new Filesystem();
  69.        if($fs->exists($url) === false)
  70.            $fs->mkdir($url);
  71.  
  72.        return $url;
  73.     }
  74.  
  75.     protected function saveImages(Hotels $hotel)
  76.     {
  77.         foreach ($this->imgCrawler as $key => $img)
  78.         {
  79.             $name = $uniq = uniqid()  . '.jpg';
  80.             $url = $this->getPathImg($hotel) .$name;
  81.             file_put_contents($url, file_get_contents($img));
  82.  
  83.             $img =( new ImagesHotels())->setHotel($hotel)->setPosition($key)->setSlug($name)->setImageName($name);
  84.             $this->em->save($img);
  85.         }
  86.     }
  87.  
  88.     public function createProperty($url)
  89.     {
  90.         $this->getCrawler($url);
  91.  
  92.         $hotel = new Hotels();
  93.         $hotel->setTitleAdvert($this->crawler->filter('title')->text())
  94.             ->setName($this->crawler->filter('title')->text())
  95.             ->setDescription($this->crawler->filter('#details')->text())
  96.             ->setMaxGuests($this->getData('huéspedes'))
  97.             ->setRooms($this->getData('huéspedes'))
  98.             ->setBathrooms($this->getData('dormitorios'))
  99.             ->setAddress('')->setCp(0)->setType('type.home')
  100.             ->setUrl($url)
  101.         ;
  102.         $this->em->save($hotel);
  103.         $this->saveImages($hotel);
  104.  
  105.         return $hotel;
  106.  
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement