Парсим дані з 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();