SlideShare a Scribd company logo
1 of 21
Парсер:
что? зачем? как?
Gleb Yama
developer
BWT group
Откуда столько информации?
Нам нужен список автомобилей.
Делать будем на PHP
- можно взять справочник и
просто перенабрать :-)
- можно самостоятельно
гуглить и заполнять базу
- можно спарсить откуда то
Подготовка. Анализ структуры сайта.
1)Использует ли сайт авторизацию для доступа к контенту (login/pass)?
2)Как строятся урлы на сайте (/?auto=Honda)?
3)Желательно найти карту сайта (sitemap.xml)
4)Использует ли сайт куки или какие-то специфические хэдеры?
5)Есть ли контент подгружаемый асинхронно (есть ajax?)?
6)Анализ структуры страниц (что именно нам нужно)
Все готово, начинаем парсить.
file_get_content
(быстро но неудобно)
CURL
(функционально,
много параметров)
guzzle
(аналог CURL)
CURL наш выбор.
private static function requestByCurl($url, $proxy)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_ENCODING, "gzip");
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64;
rv:48.0) Gecko/20100101 Firefox/48.0');
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Cookie: lang="v=2&lang=en-
us"",));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return ['code' => $code, 'data' => $response];
}
Как выбрать нужное? Вариант 1
feelinglucky/php-readability
Автоматически выбираем только основной контент.
private function parseContent($html)
{
$readability = new Readability($html);
$readabilityData = $readability->getContent();
return $readabilityData['content'];
}
Как выбрать нужное? Вариант 2
PHP Simple HTML DOM Parser
Если заранее известна структура страницы
private function parseImages($htmlText)
{
$html = str_get_html($htmlText);
$images = $html->find('img');
foreach ($images as $img) {
saveImg($img->src);
}
}
Как выбрать нужное? Вариант 3
RegExp
Если мы не знаем где находится нужный элемент
function parseEmails( $htmlText ) {
preg_match_all( "/[w][w.-]*([+][d])?(@)[w.-
]+(.)[w]+/ui", $htmlText, $matches );
return $matches[0];
}
Как то не быстро получается
И так, парсится у нас одна ссылочка за 1 секунду… а нам надо спарсить
100 000 000 ссылок (реальная задача) итого примерно 1157 дней.
Выход - многопоточность
Многопоточность для PHP - reactphp/react
$loop = ReactEventLoopFactory::create();
for ($i = 0; $i < $numberOfChildren; $i++) {
$process[$i] = new ReactChildProcessProcess("php web.php $i");
$process[$i]->on('exit', function ($exitCode, $termSignal) {
//do something on exit
});
}
foreach ($process as $pr) {
$pr->start($timer->getLoop());
$pr->stdout->on('data', function ($output) {
//do something on process output
});
}
$loop->run();
Имитация человека (Человек - парсер)
Маскировка может нас
спасти
Рандомное время между
запросами
Сайту это не нравится
Можно нанять трудолюбивых китайцев для ввода...
...совсем не нравится
Прокси
- платные
(дорого и стабильно)
- бесплатные
(дешево и ненадежно,
но иногда подходит)
Но это еще не все проблемы...
1) многоядерный процессор
2) много оперативной памяти
3) быстрый диск для работы базы
4) быстрый интернет
8 - 16 ядра
8 - 16 Гб
SSD или RAID
100 мбит - 1 гбит
Если мы хотим запостить более чем 400 потоков
Пример № 2
ТЗ “Хочу найти много сайтов в гугл,
а потом собрать все eMail с этих сайтов”
Подготовка
- У всей сайтов разная структура
страниц и ссылок. Нам нужен
краулер.
- Некоторые сайты используют JS
фреймворки (Angular, React). Нам
нужен PhantomJS.
Краулер
- найти карту сайта
- найти все страницы самостоятельно
PhantomJS
var page = require('webpage').create(),
system = require('system');
page.open(system.args[1], function (status) {
if (status !== 'success') {
console.log('Unable to access network');
} else {
var p = page.evaluate(function () {
return
document.getElementsByTagName('html')[0].outerHTML
});
console.log(p);
}
phantom.exit();
});
Как защитить свой сайт?
- авторизация
- контент в виде картинок
- контент подгружаемый по
действию пользователя
- анализ трафика
- капча и бан

More Related Content

What's hot

Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)Ontico
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»DevDay
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus0leGG
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Kubernetes в Avito - Евгений Ольков
Kubernetes в Avito - Евгений ОльковKubernetes в Avito - Евгений Ольков
Kubernetes в Avito - Евгений ОльковAvitoTech
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupalSPB
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in railssergeymoiseev
 
ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携Aki Sato
 
"Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript""Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript"FDConf
 
Михаил Трошев "AJAX в поиске по вебу"
Михаил Трошев "AJAX в поиске по вебу"Михаил Трошев "AJAX в поиске по вебу"
Михаил Трошев "AJAX в поиске по вебу"Yandex
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15MoscowJS
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
 

What's hot (20)

Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
PowerShell
PowerShellPowerShell
PowerShell
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
Kubernetes в Avito - Евгений Ольков
Kubernetes в Avito - Евгений ОльковKubernetes в Avito - Евгений Ольков
Kubernetes в Avito - Евгений Ольков
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
new JavaScript
new JavaScriptnew JavaScript
new JavaScript
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиков
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
Wordpress Cron
Wordpress CronWordpress Cron
Wordpress Cron
 
ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携
 
"Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript""Пиринговый веб на JavaScript"
"Пиринговый веб на JavaScript"
 
Михаил Трошев "AJAX в поиске по вебу"
Михаил Трошев "AJAX в поиске по вебу"Михаил Трошев "AJAX в поиске по вебу"
Михаил Трошев "AJAX в поиске по вебу"
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
 

Viewers also liked

19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"Computer Academy STEP (Mariupol branch)
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISFernando Rocha
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
Django rest framework tips and tricks
Django rest framework   tips and tricksDjango rest framework   tips and tricks
Django rest framework tips and tricksxordoquy
 
презентация 3 (команда bakaro)
презентация 3 (команда bakaro)презентация 3 (команда bakaro)
презентация 3 (команда bakaro)GoldenByteUkraine
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Eric Palakovich Carr
 

Viewers also liked (17)

Framework Battle: Django vs Flask vs Chalice
Framework Battle: Django vs Flask vs ChaliceFramework Battle: Django vs Flask vs Chalice
Framework Battle: Django vs Flask vs Chalice
 
19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
19: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
10: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
3 Презентация Kotlin - why not?
3 Презентация Kotlin - why not?3 Презентация Kotlin - why not?
3 Презентация Kotlin - why not?
 
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
23: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
21: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
Golden Byte 2014
Golden Byte 2014Golden Byte 2014
Golden Byte 2014
 
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
22: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
18: Фотоконкурс "За что я люблю ШАГ"/"ШАГ" глазами студентов"
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Golden byte
Golden byteGolden byte
Golden byte
 
Golden Byte 2016
Golden Byte 2016Golden Byte 2016
Golden Byte 2016
 
Django rest framework tips and tricks
Django rest framework   tips and tricksDjango rest framework   tips and tricks
Django rest framework tips and tricks
 
презентация 3 (команда bakaro)
презентация 3 (команда bakaro)презентация 3 (команда bakaro)
презентация 3 (команда bakaro)
 
Well being
Well beingWell being
Well being
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!
 

Similar to Парсер: что? зачем? как?

Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтендTimophy Chaptykov
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Ontico
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Антон Шлома. Drupal очереди.
Антон Шлома. Drupal очереди. Антон Шлома. Drupal очереди.
Антон Шлома. Drupal очереди. DrupalSib
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 

Similar to Парсер: что? зачем? как? (20)

Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
ETL на Python
ETL на PythonETL на Python
ETL на Python
 
Антон Шлома. Drupal очереди.
Антон Шлома. Drupal очереди. Антон Шлома. Drupal очереди.
Антон Шлома. Drupal очереди.
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 

More from STEP Computer Academy (Zaporozhye)

1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программированиеSTEP Computer Academy (Zaporozhye)
 
Путь UI developer. От «Белого» пояса к «черному»
Путь UI developer. От «Белого» пояса к «черному»Путь UI developer. От «Белого» пояса к «черному»
Путь UI developer. От «Белого» пояса к «черному»STEP Computer Academy (Zaporozhye)
 
Html5 canvas и электронный документооборот
Html5 canvas и электронный документооборотHtml5 canvas и электронный документооборот
Html5 canvas и электронный документооборотSTEP Computer Academy (Zaporozhye)
 
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В.
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В. Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В.
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В. STEP Computer Academy (Zaporozhye)
 
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.STEP Computer Academy (Zaporozhye)
 
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.STEP Computer Academy (Zaporozhye)
 
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.STEP Computer Academy (Zaporozhye)
 
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А.
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А. Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А.
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А. STEP Computer Academy (Zaporozhye)
 
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю.
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю. Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю.
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю. STEP Computer Academy (Zaporozhye)
 
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"STEP Computer Academy (Zaporozhye)
 

More from STEP Computer Academy (Zaporozhye) (15)

X-Lab презентация
X-Lab презентацияX-Lab презентация
X-Lab презентация
 
Service workers
Service workersService workers
Service workers
 
PWA: Progressive Web Application
PWA: Progressive Web ApplicationPWA: Progressive Web Application
PWA: Progressive Web Application
 
Node .js microservices
Node .js microservices Node .js microservices
Node .js microservices
 
2 презентация rx java+android
2 презентация rx java+android2 презентация rx java+android
2 презентация rx java+android
 
1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программирование
 
Путь UI developer. От «Белого» пояса к «черному»
Путь UI developer. От «Белого» пояса к «черному»Путь UI developer. От «Белого» пояса к «черному»
Путь UI developer. От «Белого» пояса к «черному»
 
Html5 canvas и электронный документооборот
Html5 canvas и электронный документооборотHtml5 canvas и электронный документооборот
Html5 canvas и электронный документооборот
 
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В.
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В. Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В.
Дипломная работа ЗФКА "ШАГ" (2015) - Хетагуров М. В.
 
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.
Дипломная работа ЗФКА "ШАГ" (2015) - Торба А.С.
 
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.
Дипломная работа ЗФКА "ШАГ" 2015) - Пантилимонова Е.И.
 
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.
Дипломный проект ЗФКА "ШАГ" (2015) - Ищенко А.С.
 
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А.
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А. Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А.
Дипломная работа ЗФКА "ШАГ" (2015) - Жучков С.А.
 
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю.
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю. Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю.
Дипломная работа "ЗФКА "ШАГ" (2015) - Есина Ю.Ю.
 
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
 

Парсер: что? зачем? как?

  • 3. Нам нужен список автомобилей. Делать будем на PHP - можно взять справочник и просто перенабрать :-) - можно самостоятельно гуглить и заполнять базу - можно спарсить откуда то
  • 4. Подготовка. Анализ структуры сайта. 1)Использует ли сайт авторизацию для доступа к контенту (login/pass)? 2)Как строятся урлы на сайте (/?auto=Honda)? 3)Желательно найти карту сайта (sitemap.xml) 4)Использует ли сайт куки или какие-то специфические хэдеры? 5)Есть ли контент подгружаемый асинхронно (есть ajax?)? 6)Анализ структуры страниц (что именно нам нужно)
  • 5. Все готово, начинаем парсить. file_get_content (быстро но неудобно) CURL (функционально, много параметров) guzzle (аналог CURL)
  • 6. CURL наш выбор. private static function requestByCurl($url, $proxy) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_ENCODING, "gzip"); curl_setopt($curl, CURLOPT_PROXY, $proxy); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0'); curl_setopt($curl, CURLOPT_HTTPHEADER, array("Cookie: lang="v=2&lang=en- us"",)); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); return ['code' => $code, 'data' => $response]; }
  • 7. Как выбрать нужное? Вариант 1 feelinglucky/php-readability Автоматически выбираем только основной контент. private function parseContent($html) { $readability = new Readability($html); $readabilityData = $readability->getContent(); return $readabilityData['content']; }
  • 8. Как выбрать нужное? Вариант 2 PHP Simple HTML DOM Parser Если заранее известна структура страницы private function parseImages($htmlText) { $html = str_get_html($htmlText); $images = $html->find('img'); foreach ($images as $img) { saveImg($img->src); } }
  • 9. Как выбрать нужное? Вариант 3 RegExp Если мы не знаем где находится нужный элемент function parseEmails( $htmlText ) { preg_match_all( "/[w][w.-]*([+][d])?(@)[w.- ]+(.)[w]+/ui", $htmlText, $matches ); return $matches[0]; }
  • 10. Как то не быстро получается И так, парсится у нас одна ссылочка за 1 секунду… а нам надо спарсить 100 000 000 ссылок (реальная задача) итого примерно 1157 дней. Выход - многопоточность
  • 11. Многопоточность для PHP - reactphp/react $loop = ReactEventLoopFactory::create(); for ($i = 0; $i < $numberOfChildren; $i++) { $process[$i] = new ReactChildProcessProcess("php web.php $i"); $process[$i]->on('exit', function ($exitCode, $termSignal) { //do something on exit }); } foreach ($process as $pr) { $pr->start($timer->getLoop()); $pr->stdout->on('data', function ($output) { //do something on process output }); } $loop->run();
  • 12. Имитация человека (Человек - парсер) Маскировка может нас спасти Рандомное время между запросами
  • 13. Сайту это не нравится Можно нанять трудолюбивых китайцев для ввода...
  • 15. Прокси - платные (дорого и стабильно) - бесплатные (дешево и ненадежно, но иногда подходит)
  • 16. Но это еще не все проблемы... 1) многоядерный процессор 2) много оперативной памяти 3) быстрый диск для работы базы 4) быстрый интернет 8 - 16 ядра 8 - 16 Гб SSD или RAID 100 мбит - 1 гбит Если мы хотим запостить более чем 400 потоков
  • 17. Пример № 2 ТЗ “Хочу найти много сайтов в гугл, а потом собрать все eMail с этих сайтов”
  • 18. Подготовка - У всей сайтов разная структура страниц и ссылок. Нам нужен краулер. - Некоторые сайты используют JS фреймворки (Angular, React). Нам нужен PhantomJS.
  • 19. Краулер - найти карту сайта - найти все страницы самостоятельно
  • 20. PhantomJS var page = require('webpage').create(), system = require('system'); page.open(system.args[1], function (status) { if (status !== 'success') { console.log('Unable to access network'); } else { var p = page.evaluate(function () { return document.getElementsByTagName('html')[0].outerHTML }); console.log(p); } phantom.exit(); });
  • 21. Как защитить свой сайт? - авторизация - контент в виде картинок - контент подгружаемый по действию пользователя - анализ трафика - капча и бан

Editor's Notes

  1. добавить лого и кто ты такой