namespace
[carstats.git] / app / lib / AutovitFetcherClass.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
 
namespace carstats;
 
/**
 * @author      Razvan Stanga <git@razvi.ro>
 */
 
class AutovitFetcher extends Common {
 
        public $startPage = 1;
        public $totalPages = 1;
        private $carBrands = array ();
        private $domain = "http://www.autovit.ro";
 
        public function __construct ()
        {
                $this->setUrlBase ("http://www.autovit.ro/autoturisme");
                // required
                parent::init();
        }
 
        protected function getTotalPages ()
        {
                preg_match_all ("|\<p class=\"om-pager\">(.*)\<\/p\>|isU", $this->getProcessedHtml(), $pages);
                preg_match_all ("|\<a href\=\"(.*)\" \>([0-9]+)\<\/a\>|isU", $pages[0][0], $lastpage);
                $this->totalPages = $lastpage[2][ (count ($lastpage[2])-1) ];
        }
 
        protected function getBrands ()
        {
                preg_match_all ("|\<li class\=\"expanded \"\>\<a href\=\"(.*)\" data-no\=\"([0-9]+)\"\>\<span\>(.*)\<\/span\>\<\/a\>\<\/li\>|isU", $this->getProcessedHtml(), $brandsMatch);
                $this->carBrands = $brandsMatch[3];
        }
 
        protected function getBrandModel ($model)
        {
                foreach ($this->carBrands as $brand) {
                        if ( stristr ($model, $brand) ) {
                                return array (
                                        "brand" => $brand,
                                        "model" => trim ( str_replace ($brand, "", $model) ),
                                );
                        }
                }
        }
 
        protected function getCarData ($data)
        {
                preg_match ("| title\=\"Putere \(CP\)\: ([0-9]+)\"|isU", $data, $dataMatch);
                if ( count ($dataMatch) ) {
                        $hp = $dataMatch[1];
                        $data = str_replace ($dataMatch[0], "", $data);
                }
                preg_match ("|\<span\>\<span\>Fabricatie\<\/span\>\: \<strong\>([0-9]+)\<\/strong\>\<\/span\>\<strong\>(.*)\<\/strong\>\<strong\>(.*)\<\/strong\>\<span\>\<span\>Rulaj pana la\<\/span\>\: \<strong\>([0-9]+) km\<\/strong\>\<\/span\>|isU", $data, $dataMatch);
                if ( count ($dataMatch) == 0 ) { // new car ?
                        preg_match ("|\<span\>\<span\>Fabricatie\<\/span\>\: \<strong\>([0-9]+)\<\/strong\>\<\/span\>\<strong\>(.*)\<\/strong\>\<strong\>(.*)\<\/strong\>\<span\>\<\/span\>|isU", $data, $dataMatch);
                        return array (
                                "year" => $dataMatch[1],
                                "engine" => $dataMatch[2],
                                "body" => $dataMatch[3],
                                "km" => 0
                        );
                } else {
                        return array (
                                "year" => $dataMatch[1],
                                "engine" => $dataMatch[2],
                                "body" => $dataMatch[3],
                                "km" => $dataMatch[4]
                        );
                }
        }
 
        public function batch ()
        {
                $this->totalPages = ($this->totalPages < $this->startPage) ? $this->startPage : $this->totalPages;
                for ($page=$this->startPage;$page<=$this->totalPages;$page++) {
                        $this->debug ("start page ".$page);
                        $this->getHtml ("?p=".$page);
                        if ( $page == 1 ) {
                                $this->getBrands ($this->getProcessedHtml());
                        }
 
                        preg_match_all ("|\<strong class\=\"om-price-amount\"\>([0-9 ]+)\<\/strong\>|isU", $this->getProcessedHtml(), $matchPrice);
                        preg_match_all ("|\<h3\>(.*)\<\/h3\>|isU", $this->getProcessedHtml(), $matchCar);
                        preg_match_all ("|\<p class=\"basic\"\>(.*)\<\/p\>|isU", $this->getProcessedHtml(), $matchData);
 
                        foreach ($matchPrice[1] as $key => $price) {
                                preg_match ("|\<a href\=\"(.*)\"\>(.*)\<\/a\>|isU", $matchCar[1][$key], $carMatch);
                                $carLink = addslashes ($this->domain.$carMatch[1]);
 
                                $carDetails = $this->getBrandModel ($carMatch[2]);
 
                                $brandId = $this->storeCarBrand ($carDetails['brand']);
                                $modelId = $this->storeCarModel ($carDetails['model'], $brandId);
 
                                $carData = $this->getCarData ($matchData[1][$key]);
                                $carData['price'] = str_replace (" ", "", $price);
                                $engineId = $this->storeCarEngine ($carData['engine'], $brandId, $modelId);
 
                                $this->storeCarPrice ($brandId, $modelId, $engineId, $carLink, $carData);
 
                                /*
                                Db::query ("SELECT `id` FROM `prices` WHERE `brand_id`='".$brandId."' AND `model_id`='".$modelId."' AND `carLink`='".$carLink."'");
                                if ($row = Db::fetchArray()) {
                                } else {
                                        Db::query("INSERT INTO `prices` (`id`, `brand_id`, `model_id`, `engine_id`, `carLink`, `year`, `fuel`, `km`, `kmRange`, `price`, `priceRange`, `active`)
                                        VALUES ('NULL', '".$brandId."', '".$modelId."', '".$engineId."', '".$carLink."', '".$carData['year']."', '1', '".$carData['km']."', '".$kmRange."', '".$price."', '".$priceRange."', '1')");
                                }
                                */
                        }
                        $this->debug ("memory usage: ".$this->getMemoryUsage(), 2);
                        $seconds = mt_rand (1, 5);
                        $this->debug ("sleep for ".$seconds." seconds", 2);
                        sleep ( $seconds );
                }
        }
 
}
 
?>
comments