Недавно было обновление 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();
Anatoly
- 29 апреля 2018, 13:03 ↓12++++++++++++
Admin
- 29 апреля 2018, 14:49 ↓Игорь
- 05 мая 2018, 12:49 ↓Игорь
- 05 мая 2018, 12:59 ↓За код спасибо. Взамен могу сказать что раньше работало через мобайл версию.
Admin
- 05 мая 2018, 14:55 ↓Вася
- 27 августа 2018, 17:13 ↓Admin
- 27 августа 2018, 17:16 ↓Admin
- 31 августа 2018, 14:13 ↓Николай Федоркин
- 30 августа 2018, 03:40 ↓Admin
- 31 августа 2018, 14:09 ↓Максим
- 13 января 2020, 10:38 ↓не успел позвонить купить
Admin
- 31 августа 2018, 14:10 ↓Алихан
- 01 октября 2018, 22:03 ↓Михаил
- 17 октября 2018, 09:58 ↓Такой вот вопрос, сейчас я парсю по 15-20 страниц сразу, загрузка 7-10 минут. Не подскажешь, как это все можно ускорить?
Admin
- 17 октября 2018, 10:21 ↓Можно оптимизировать код. Не делать лишних запросов.
Код представлен в целях ознакомления и понятия принципа работы.
denspit
- 31 декабря 2018, 17:25 ↓А то у меня значения не совпадают в phoneToken и в "?pt=" который он отправляет по запросу.
Admin
- 02 января 2019, 16:25 ↓Виктор
- 27 января 2019, 17:52 ↓Admin
- 27 января 2019, 18:13 ↓Виктор
- 27 января 2019, 18:23 ↓user
- 31 января 2019, 11:36 ↓TRUNCATE phpMyAdmin
- 05 февраля 2019, 21:14 ↓Виктор
- 12 февраля 2019, 13:54 ↓Admin
- 12 февраля 2019, 13:59 ↓Виктор
- 12 февраля 2019, 14:13 ↓Виктор
- 12 февраля 2019, 16:07 ↓Виктор
- 12 февраля 2019, 20:40 ↓Дмитрий Климик
- 15 февраля 2019, 08:08 ↓Вертибокс
- 15 февраля 2019, 16:37 ↓Антон
- 16 февраля 2019, 23:13 ↓Огромное спасибо за статью!
С уважением, Антон
satis
- 18 февраля 2019, 11:25 ↓replace.org.ua/post/123684/#p123684
Ростислав
- 27 февраля 2019, 16:40 ↓Пробовал куки чистить перед каждым запросом (proxy-list: ~ 20k).
Пробовал через Cypress, 1 час парсил, потом снова бан.
Ребята, какие мысли?
StRAf
- 01 марта 2019, 18:00 ↓Для моб версии
1. Представляетесь мобильником:
2. Ожидаете полной загрузки страницы (куков) забираете
и делаете XHR запрос:
Добавляете в хидер:
var bearer=«Bearer „+valuec;
Антон
- 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);
Но не могу
StRAf
- 03 марта 2019, 19:53 ↓Антон
- 04 марта 2019, 13:27 ↓Дмитрий
- 15 марта 2019, 14:08 ↓но при запросе XMLHttpRequest — телефон не отдается
Дмитрий
- 17 марта 2019, 19:10 ↓Владислав
- 23 апреля 2019, 18:30 ↓Вся проблема в том, что они научились банить запросы на www.olx.ua/ajax/misc/contact/phone/
Страницы как парсились, так парсятся…
DM
- 28 апреля 2019, 14:45 ↓sqrt3000
- 08 мая 2019, 21:16 ↓tmg
- 14 мая 2019, 19:18 ↓идеально если обеспечить выгрузку в crm
Sergey
- 29 мая 2019, 13:23 ↓Можно парсить номера OLX используя браузер и JS:
1. после загрузки страницы добавляете JS код, который нажимает на кнопку показать номер телефона — появистя номер телефона.
2. отправляете этот номер на свой сервак, где скрипт записывает его в базу
Что бы работало, нужно менять IP и сделать кликер (не браузерный), который будет кликать по пустому месту и таким образом моделировать действия пользователя. Добавить TimeOut, что бы JS успевал загрузить инфу, ну и что бы было похоже на то, что вы настоящий пользователь.
Довольно неудобный метод, т.к. нужен отдельный комп, на котором это будет происходить, ну и парсинг медленно происходит (есть больше компов то быстрей).
Я так парсил месяц назад.
StRaf
- 18 июня 2019, 17:53 ↓1. PhantomJS
2. Puppeteer
Естественно необходим набор рабочих proxy
Пример работы скрипта на puppeteer, специально для наглядности включен режим Puppeteer PLX Parser
Владимир
- 21 июня 2019, 17:49 ↓Max
- 29 июля 2019, 09:24 ↓Роман
- 11 августа 2019, 15:56 ↓admin
- 13 января 2020, 11:28 ↓