Решил Вам предоставить информацию, которая поможет спарсить ЛЮБОЙ сайт. Теперь КАЖДЫЙ сможет парсить всё, что душе угодно. К тому же написать бесплатный грабер сайтов не составит никакого труда...
Как я решил спарсить Авито, или PhantomJS + PHP как идеальный способ сбора информации
Здравствуйте, мои дорогие читатели! Сегодня я решил поделиться с Вами информацией о создании бесплатно парсера своими руками, или как некоторые люди говорят - грабера.
Для тех, кто в танке и не в теме. Парсер (или парсинг, т.е. процесс) - это программный продукт, который помогает собирать в автоматическом режиме информацию с площадок. Я таким образом смог насобирать несколько тысяч песен с кучи сайтов. Я уже писал об этом в моей статье Пишем php парсер сайтов с нуля, но я пользовался немного другой библиотекой и был далёк от совершенства.
Все основные проблемы моего прошлого подхода заключались в том, что в старом методе сбора не было эмуляции работы пользователя. Т.е. к серверу приходили запросы в автоматическом режиме, и более-менее умные сайты (я сейчас говорю про злополучный Avito) быстро распознавали меня как робота и блокировали доступ к сайту. ну сделал я 5-10 обращений к сайту и что дальше? Бан на полчаса или на весь день. После такого жить просто не хотелось. Тогда я всё бросил и решил уйти в монахи, но через год понял. что это не моё. И нашёл для себя PhantomJS.
PhantomJS сделает из машины - человека
Фантом - это такой webkit-браузер, который можно запускать без графического интерфейса и бегать по страницам других сайтов без боязни быть заблокированным. Если попроще, то это оболочка, которая придаёт жизнь Вашему парсеру, помогает дать ему душу. Т.е. с использованием PhantomJS вы сможете представиться каждому порталу как Настоящий пользователь!
Сейчас я опишу подробную инструкцию по тому, с чего начать, опишу несколько интересных фишек, которые я смог обнаружить на просмотрах интернета + часть я вывел опытным путём. Поехали!
1. Скачать программу
В начале нам нужно идти на сайт разработчиков. На главной странице скачиваем библиотечку и радуемся, теперь у нас есть свой Фантом!
Заходим в папку bin и видим файл под названием phantomjs.exe Именно этот файл и будет играть основную роль в нашем создании бесплатном парсере (Вы тратите только своё время, не более того).
2. Переходим к PHP коду
Давайте в начале создадим код на PHP, который будет обращаться к нашему фантому и выводить полученные результаты. Кстати, это вариант под номером 1.
В функцию shell_exec я передаю Путь, где лежит фантом и Путь к исполняемому JavaScript-коду. Да да, весь парсинг будет на JavaScript, т.е любой из Вас сможет безболезненно использовать JQuery и JS и легко работать с DOM-моделью (блоками сайта).
3. Пришла пора JavaScript
А теперь давайте изучим код, на примере которого я смог легко спарсить страничку с Avito. Вот пример:
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
// Example using HTTP POST operation"use strict";//Тут объявляю несколько юзерагентов, типа мы под разными браузерами заходим постоянноvaruseragent=[];useragent.push('Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50');useragent.push('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25');useragent.push('Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02');//Здесь находится страничка, которую нужно спарситьvarsiteUrl='https://m.avito.ru/komsomolsk-na-amure/kvartiry/1-k_kvartira_29_m_45_et._665423964';varpage=require('webpage').create();//Это я передаю заголовки //Их можно посмотреть в браузере на закладке Network (тыкайте сами, ищите сами)page.customHeaders={":host":"m.avito.ru",":method":"GET",":path":"/komsomolsk-na-amure/kvartiry?user=1&hist_back=1",":scheme":"https",":version":"HTTP/1.1","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-language":"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":useragent[Math.floor(Math.random()*useragent.length)]};//Здесь я отключаю загрузку сторонних скриптов для ускореняи парсингаpage.onResourceRequested=function(requestData,request){if((/http:\/\/.+?\.css$/gi).test(requestData['url'])){request.abort();}if((/\.doubleclick\./gi.test(requestData['url']))||(/\.pubmatic\.com$/gi.test(requestData['url']))||(/yandex/gi.test(requestData['url']))||(/google/gi.test(requestData['url']))||(/gstatic/gi.test(requestData['url']))){request.abort();return;}};//Этот код выводит ошибки, дебаг так сказатьpage.onError=function(msg,trace){console.log(msg);trace.forEach(function(item){console.log(' ',item.file,':',item.line);});};String.prototype.stripTags=function(){returnthis.replace(/<\/?[^>]+>/g,'');};//Объявим переменные для инф-и об объектеvarhref,json,price,adress,fio,descriptionShort,descriptionFull;//Здесь мы открываем страничкуpage.open(siteUrl,function(status){if(status!=='success'){console.log('Unable to access network');}else{//Получим ценник квартиркиvarprice=page.evaluate(function(){return[].map.call(document.querySelectorAll('.price-value'),function(span){returnspan.innerText;});});//Выведемconsole.log(price);}});
С помощью такого небольшого кода я смог зайти на страницу Авито и спарсить цену квартиры. А на что способны Вы?) Я собирал таким образом всю информацию с практически ЛЮБОГО сайта. Здесь нет предела возможностям.
А теперь давайте ка покажу несколько фишечек при работе с PhantomJS.
Фишечки для работы с Фантомом
1.Ожидание происхождения какого-то события
1
2
3
4
5
6
7
8
9
10
11
waitFor(function(){returnpage.evaluate(function(){// Кликаем на кнопку$('.button').trigger('click');// Ждём, пока элемент не станет скрытымreturn$('.button').is(':hidden');});},function(){// Выполняем действия после того, как необходимый элемент появился на экране});
Очень полезно, если хотите нажать на какую-то кнопку и подождать возврата какого-то результата. Способ поможет обойти очень много защитных функций сайтов.
2. Подключение JQuery к сайту (вдруг нет, а вот вдруг)
1
2
3
4
5
6
7
page.open(siteUrl,function(status){if(status==='success'){// Инклудим jQuerypage.injectJs('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js');//и что-то там другое}});
Просто вставляем в загруженную страницу свою библиотеку и начинаем работать!
3. Выключаем всё CSS и картинки
А вот такой простейший код поможет отключить загрузку всех CSS-стилей и картинок, дабы ускорить работу сайта.
Остальные идеи и прелести Вы сможете подсмотреть в моём верхнем коде. Просто посмотрите функции и возьмите себе на заметку какие-то нужные вещи.
Выводы
Могу сказать, что с помощью PhantomJS можно написать бесплатный PHP парсер сайтов всего лишь за пару дней. Любая площадка будет подвластна Вам, только если Вы сможете привлечь свою светлую голову в этот процесс.
На деле всё это не так уж и просто, так что школьничкам не советую писать кучу недопарсеров, которые будут засорять мировую паутину. Пробуйте подойти к делу с умом и у Вас всё обязательно получится!
Скоро будет новый подгончик по материалам! Всем огромное спасибо за посещение моего сайта!
Если статья была для Вас полезной - Поделитесь ссылкой!
Спасибо , отличная статья !
А если нужно парсить все цены на 3х комнатные квартиры ? парсить все варианты на текущей страницы и переходить дальше пока не конец пагинатора.
Есть ли какие то универсальные функции которые проходятся по всему каталогу товаров?
Получаете все странички пагинации и начинаете в цикле их обходить. Если нужны трёшки - находите нужные url и парсите его. Адрес отличается GET-параметрами, почитайте.
С такой проблемой не сталкивались для phantomjs "You will be redirected to Robot Checker. Please enable Javascript in browser."?
т.е. на сервере выдает такую ошибку на компе все без проблем заходит и получает нужную инфу
из Kharkiv Oblast, Ukraine36.23038300000007449.9935http://maps.google.com/maps?z=15&q=49.9935,36.230383000000074
Написано, что надо включить JS в браузере. Погугли про это, либо какие-то настройки другие на серваке, даже сказать пока не могу, с такой проблемой не сталкивался.
Комментарии (4)