Парсим дані з olx

Блог Фрилансера 5 хвилин 46 секунд 10 бер. 2018
 Парсим дані з olx

Данна стаття представлену суто в ознайомлювальному характері

Нещодавно було оновлення OLX і деякі моменти не працюють

Як то раз мені довелося шукати квартиру і перші посилання що були в інтернеті вели на майданчик OLX .Але все нові пропозиції йшли в перші пів години . кожну хвилину ,якщо з'являлася нова пропозиція скрип писав це в базу і оправляв мені телеграм.

Для парсингу використав найпростішу бібліотеку phpQuery.

Запити роблю через Curl.

/*підключаємо бібліотеку*/
 require ('phpQuery.php');

 /*підключення до бази*/
 require ('bd.php');
/*функція отримання контенту змінну*/

function curl_content($url){
$ ch = curl_init ($ url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt ($ ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; WinNT; en; rv:1.0.2) Gecko/20030311 Beonex/0.8.2-stable');
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefiles);
//curl_setopt($ch, CURLOPT_NOBODY,true);
//curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefiles);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//////курл
$html=curl_exec($ch);
return $html;
unset($url);
}
$html=curl_content('https://www.olx.ua/nedvizhimost/arenda-kvartir/dolgosrochnaya-arenda-kvartir/uman/');// адресу сторінки з якою паримо дані
phpQuery::newDocument($html);
//виводимо в циклі
$menu = pq('#offers_table')->find('.breakword');

$prices=pq('.space')->find('a.detailsLink');

$ sr = New Test ();
print_r($sr->b);
$ i = 0;
foreach ($menu as $res) {
 $pqres=pq($res);//обертаємо в pq для використання у foreach
$linkarray=$pqres->find('a')->attr('href');//отримуємо посилання
$pricearray=$pqres->find('p.price>strong')->text();//отримуємо ціну
$img=$pqres->find('img.fleft')->attr('src');//витягуємо картинки
$url = $linkarray;

На скільки знаємо, щоб дізнатися номер потрібно натиснути "показати номер". Щоб обійти це є ось такий скріпп —  Цей скрип вже не працює < /strong>

$cookie_path = $_SERVER['DOCUMENT_ROOT'].'/cookie.dat';
preg_match('|-ID(.*).html|', $url, $id);
$olx = curl_init($url);
curl_setopt($olx, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($olx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($olx, CURLOPT_HEADER, 1);
curl_setopt($olx, CURLOPT_COOKIEFILE, $cookie_path);
curl_setopt($olx, CURLOPT_COOKIEJAR, $cookie_path);
$result = curl_exec($olx);
$content = $result;
curl_close($olx);
preg_match("|phoneToken = '(.*)';|", $result, $token);
$olx_number = curl_init('https://www.olx.ua/ajax/misc/contact/phone/' . $id[1] . '/?pt=' . $token[1]);
    curl_setopt($olx_number, CURLOPT_HTTPHEADER, [
            'Host: www.olx.ua',
            'Accept: */*',
            'Accept-Language: uk,ru;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding: gzip, deflate, br',
            'Connection: keep-alive',
            'X-Requested-With: XMLHttpRequest'
        ]);
        curl_setopt($olx_number, CURLOPT_REFERER, $url);
        curl_setopt($olx_number, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($olx_number, CURLOPT_COOKIEFILE, $cookie_path);
        curl_setopt($olx_number, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($olx_number, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($olx_number);

        curl_close($olx_number);
        

        $json = json_decode($result);
 

Далі заходимо на сторінку щоб отримати текст що всередині (Опис).І підготуємо дані для запису в базу

phpQuery::newDocument($content);
$htmlcon=pq('#textContent>p')->text();
$big_img=pq('.photo-glow')->find('img')->attr('src');

phpQuery::newDocument($json->value);
$tel=pq('span')->text();

echo $json->value;
echo $big_img;


if (empty($tel)) {
    $tel=$json->value;
}


$ resarray = array (
  'imglink'=>$img,
  'link' => $linkarray,
  'price' =>$pricearray,
  'tel' => $tel,
  'content'=> $htmlcon,
);

$linkimgbd=$resarray['imglink'];
$linkbd=$resarray['link'];
$pricebd=$resarray['price'];
$telbd=$resarray['tel'];
$conrentbd=trim($resarray['content']) ;
 

Наступний крок, робота з базою та api телеграма

/*вибірка з бази*/
$resultbd =mysqli_query($mysqli,"SELECT * FROM base ORDER BY id DESC") або die (mysql_error());
$rowbd =mysqli_fetch_array($resultbd);
if ($rowbd['link']==$resarray['link']) {
echo "немає нових";
echo $resarray['content'];
}
else {
echo "Є нові оголошення";
$mysqli->query("INSERT INTO base (link,tel,price,content) VALUES ('$linkbd','$telbd','$pricebd','$conrentbd'); ") or die (mysql_error( ));


$tokens = 'XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';// токен що видав вам @BotFather
$idChat = -XXXXXXXXXXXXXX;//id чата куди потрібно відправити


// відправляємо фотку
$param = [
'chat_id'=> $idChat,
'photo' => $big_img,
];
curl_content('https://api.telegram.org/bot'.$tokens.'/sendPhoto?'.http_build_query($param));

// надсилаємо посилання
$masenge = $conrentbd.chr(10).'------------- '.chr(10).'Ціна оренди '.$pricebd.''.chr(10).'- ----'.chr(10).'тел: '.$telbd.''.chr(10).$linkbd;
$param = [
'chat_id'=> $idChat,
'text' => $masenge,
];
curl_content('https://api.telegram.org/bot'.$tokens.'/sendMessage?'.http_build_query($param));
}

echo "---------------
";
echo $rowbd['link'];

echo "---------------
";

echo $resarray['link'];
if(++$i == 1) break;//обмеження в 1 висновку
}

phpQuery::unloadDocuments();