Парсим данные из olx /

Как то раз мне пришлось искать квартиру и первые ссылки что были в интернете вели на площадку OLX.Но все новые предложения уходили в первые пол часа.Вот тогда и пришла идея парсить olx

10 / 03 / 2018 6863 php, parser Aвтор: Фрилансер
Парсим данные из olx

Недавно было обновление OLX и некоторые моменты не работают

Как то раз мне пришлось искать квартиру и первые ссылки что были в интернете вели на площадку OLX .Но все новые предложения уходили в первые пол часа .Вот тогда и пришла идея парсить olx сохранять в базу последнее предложение и поставив скрипт на cron обновлял каждую минуту ,если появлялось новое предложение скрип писал это в базу и оправлял мне в телеграм.

Для парсинга использовал самую простую библиотеку 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;

На сколько знаем чтобы узнать номер нужно нажать "показать номер ". Чтобы обойти это есть вот такой скрип

 

$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") or 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();

3 случайных Поста

Card image cap
Telsender bot telegram
Card image cap
Шаблон письма Contact Form 7 в переменную
Card image cap
Парсим данные из olx

коммент.

avatar

Anatoly

- 29 апреля 2018, 13:03
красавчик! ты лучший! у меня столько времени ушло, чтобы это разрулить… и так и не пришло в мою голову поиграться с опциями курла… но аякс на телефон это вообще!!!
12++++++++++++
avatar

Admin

- 29 апреля 2018, 14:49
Спасибо))
avatar

Игорь

- 05 мая 2018, 12:49
Здравствуйте, так и не могу сделать вывод номера. Пустая страница. Помогите. Возможно они улучшили защиту.
avatar

Игорь

- 05 мая 2018, 12:59
Исправил агента. Работает.
За код спасибо. Взамен могу сказать что раньше работало через мобайл версию.
avatar

Admin

- 05 мая 2018, 14:55
Возможно этот метот вскоре перестанет работать. Буду следить за изминениями
avatar

Вася

- 27 августа 2018, 17:13
Что делать, если ссылка вида «www.olx.ua/ajax/misc/contact/phone/'. $id[1]. '/?pt='. $token[1]» возвращает {«value»:«000 000 000»}
avatar

Admin

- 27 августа 2018, 17:16
Нужно поставить задержку на загрузку url 1-2 сек
avatar

Admin

- 31 августа 2018, 14:13
удаляйте файл
unlink( $_SERVER['DOCUMENT_ROOT'].'/cookie.dat');
avatar

Николай Федоркин

- 30 августа 2018, 03:40
Добрый день. Нужно посмотреть телефон с неактивного объявления на олх. Помогите пожолуйста. Будут благодарен и в долгу не останусь.
avatar

Admin

- 31 августа 2018, 14:09
Пришлите ссылку
avatar

Admin

- 31 августа 2018, 14:10
Если в номере телефона появились 00000 нужно удалять файл куки
unlink( $_SERVER['DOCUMENT_ROOT'].'/cookie.dat');
avatar

Алихан

- 01 октября 2018, 22:03
Благодарствую, все работает!
avatar

Михаил

- 17 октября 2018, 09:58
Приветствую, спасибо тебе большое, на основании твоей статью — сделал парсер множества записей, хотя я в php если честно слабенький…
Такой вот вопрос, сейчас я парсю по 15-20 страниц сразу, загрузка 7-10 минут. Не подскажешь, как это все можно ускорить?
avatar

Admin

- 17 октября 2018, 10:21
Все уже зависит от хостинга. Количества памяти php.
Можно оптимизировать код. Не делать лишних запросов.
Код представлен в целях ознакомления и понятия принципа работы.
avatar

denspit

- 31 декабря 2018, 17:25
И как работает парсер?
А то у меня значения не совпадают в phoneToken и в "?pt=" который он отправляет по запросу.
avatar

Admin

- 02 января 2019, 16:25
Все отлично работает!)))
avatar

Виктор

- 27 января 2019, 17:52
После 24.01.19 олх поменяло механизм получения телефонов. Как теперь быть…
avatar

Admin

- 27 января 2019, 18:13
Да. Поменяло и теперь будет блокировать по ip.(((
avatar

Виктор

- 27 января 2019, 18:23
мне кажется они не айпи блокируют, а чтото с генерацией одноразовых значений в куках. а сообщение пишут что айпи. просто другого сообшения еще не сочинили.
avatar

user

- 31 января 2019, 11:36
Ставил задержку перед получением пару секунд телефона. Запросов 10 прошло норм, дальше блок.
avatar

TRUNCATE phpMyAdmin

- 05 февраля 2019, 21:14
Кто нить разобрался как парсить телефоны с olx после нововведения? каких куков ему не хватает?
avatar

Виктор

- 12 февраля 2019, 13:54
У кого-то получилось с новым олх?
avatar

Admin

- 12 февраля 2019, 13:59
Пока что не работает. номера телефонов!!!
avatar

Виктор

- 12 февраля 2019, 14:13
чтото новое опять придумали с куками
avatar

Виктор

- 12 февраля 2019, 16:07
подозрение что куки генерирует не сама страница, а ктото вместо нее в процессе загрузки
avatar

Виктор

- 12 февраля 2019, 20:40
Добрый вечер. у кого-нибудь получилось?
avatar

Дмитрий Климик

- 15 февраля 2019, 08:08
Привет, Админ, напиши пожалуйста на почту, вчера сидел пробовал разбираться в чём проблема — нашёл. Нужно сделать решение, нужна помощь.
avatar

Вертибокс

- 15 февраля 2019, 16:37
Дмитрий, напиши сюда в чем причина. Найдем решение вместе.
avatar

Антон

- 16 февраля 2019, 23:13
Парни, парсинг телефонов OLX — кровь из носа, уповаем на вас! Надеюсь вскоре будет найдено решение!
Огромное спасибо за статью!

С уважением, Антон
avatar

satis

- 18 февраля 2019, 11:25
Народ, ссылка по теме, может поможет.
replace.org.ua/post/123684/#p123684
avatar

Ростислав

- 27 февраля 2019, 16:40
Реально не получается.
Пробовал куки чистить перед каждым запросом (proxy-list: ~ 20k).
Пробовал через Cypress, 1 час парсил, потом снова бан.
Ребята, какие мысли?
avatar

StRAf

- 01 марта 2019, 18:00
PhantomJS парсит номера из мобильной и РС версий.
Для моб версии
1. Представляетесь мобильником:
page.settings.userAgent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Mobile Safari/537.3';
 page.viewportSize = { width: 414, height: 736 };
 page.zoomFactor = 1;
  page.clipRect = { top: 0, left: 0, width: 414, height: 736 };
2. Ожидаете полной загрузки страницы (куков) забираете
var valuec = readCookie('a_access_token');	
и делаете XHR запрос:
var url='https://m.olx.ua/api/v1/offers/'+store+'/phones';
Добавляете в хидер:
var bearer=«Bearer „+valuec;
getText = function(url, callback) {

    var request = new XMLHttpRequest();
    request.onreadystatechange = function()
    {
        if (request.readyState == 4 && request.status == 200)
        {
            callback(request.responseText);
        }
    }; 
    request.open('GET', url);
		window.setTimeout( function(){	
    request.send();
	 },3000);  
}
avatar

Антон

- 02 марта 2019, 20:16
Спасибо, огромное!
А не могли бы немного поподробнее, я только начинающий программист и не совсем понятно, где именно прописывать данные о мобильной версии браузера и т.д.

Документацию на сайте сейчас читаю по PhantomJs и пытаюсь сделать через PHP.

Там есть пример кода, указанно ниже, но пока не могу сообразить, как сделать вашим способом. Заранее спасибо!

request.json

{
«url»:«example.com»,
«renderType»:«plainText»
}

php code

$url = 'http://PhantomJScloud.com/api/browser/v2/a-demo-key-with-low-quota-per-ip-address/';
$payload = file_get_contents ( 'request.json' );
$options = array(
'http' => array(
'header' => «Content-type: application/json\r\n»,
'method' => 'POST',
'content' => $payload
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }
var_dump($result);

Но не могу
avatar

StRAf

- 03 марта 2019, 19:53
Учитесь пользоваться Google

download the PhantomJS binary, upload it somewhere and make it executable (chmod +x)
if you are going to make screenshots, setup fontconfig (this is pretty specific to my config but the goal is to make sure to have at least some fonts on your system)
run the following in PHP:
$response = exec('/path/to/phantomjs myscript.js');
avatar

Антон

- 04 марта 2019, 13:27
Спасибо!
avatar

Дмитрий

- 15 марта 2019, 14:08
PhantomJS — получаем все куки. Все ок.
но при запросе XMLHttpRequest — телефон не отдается
avatar

Дмитрий

- 17 марта 2019, 19:10
Еще и другое скажу. Через phantomjs не распарсишь. Страницу получишь, но клик не сделаешь. Через selenium клик делаешь, но постоянно попадаешь в бан. Никто решения еще не нашел?
avatar

Владислав

- 23 апреля 2019, 18:30
Ребят при чём здесь, то какой инструмент используете?
Вся проблема в том, что они научились банить запросы на www.olx.ua/ajax/misc/contact/phone/
Страницы как парсились, так парсятся…
avatar

DM

- 28 апреля 2019, 14:45
Добрый! Парни, помогите пожалуйста найти телефон продавца на OLX из неактивного объявления. Готов оплатить услугу
avatar

tmg

- 14 мая 2019, 19:18
куплю готовое решение
идеально если обеспечить выгрузку в crm
  • Комментарий был удален.
    1. avatar

      Sergey

      - 29 мая 2019, 13:23
      Добрый день.
      Можно парсить номера OLX используя браузер и JS:
      1. после загрузки страницы добавляете JS код, который нажимает на кнопку показать номер телефона — появистя номер телефона.
      2. отправляете этот номер на свой сервак, где скрипт записывает его в базу
      Что бы работало, нужно менять IP и сделать кликер (не браузерный), который будет кликать по пустому месту и таким образом моделировать действия пользователя. Добавить TimeOut, что бы JS успевал загрузить инфу, ну и что бы было похоже на то, что вы настоящий пользователь.

      Довольно неудобный метод, т.к. нужен отдельный комп, на котором это будет происходить, ну и парсинг медленно происходит (есть больше компов то быстрей).
      Я так парсил месяц назад.
      avatar

      StRaf

      - 18 июня 2019, 17:53
      OLX парсится
      1. PhantomJS
      2. Puppeteer
      Естественно необходим набор рабочих proxy
      Пример работы скрипта на puppeteer, специально для наглядности включен режим
      puppeteerOptions: {  headless: false } 
      Puppeteer PLX Parser
      avatar

      Владимир

      - 21 июня 2019, 17:49
      можете скинуть исходники?
      avatar

      Max

      - 29 июля 2019, 09:24
      Есть какое-то рабочее решение на данный момент?
      avatar

      Роман

      - 11 августа 2019, 15:56
      Добрый день! Можете помочь с номером телефона из неактивного объявления на olx? Ссылка www.olx.ua/obyavlenie/otdam-v-horoshie-ruki-IDDNr9q.html

      © SiteBlog designer