Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
//функция для построения DOM
var _html=function(html){
return $('<div></div>').html(html);
};
//К примеру, скомбинируем node'овский request и jQuery
request.get(url, function(err,res,html){
var container=_html(html);
var name=container.find('.name span').text().trim();
});
//Или то же самое на чистом jQuery
$.get(url, function(html){
var container=_html(html);
var name=container.find('.name span').text().trim();
});
<?php
$pos2 = 0;
for ($i=0; $i<substr_count($где_искать, "что_искать"); $i++) {
$pos1 = stripos($где_искать, "<открывающий_тег", $pos2);
$pos2 = stripos($где_искать, "</закрывающий_тег>", $pos1);
$temp = substr($где_искать, $pos1 + strlen(открывающий_тег), $pos2 - $pos1 - strlen(открывающий_тег));
}
?>
неплохо работает связка awesomium+C#+CSQuery
Данный вопрос решился относительно быстро, пайтон воркеры запускали phantomjs как обычную консольную команду и слушали output, это не было использование какого-то драйвера.
думаю на стороне сайта-донора была защита по кол-ву обращений с одного IP
упала до 6-10 тысяч записей за отведенные 6 часов
Оценка прироста от такого решения не проводилась? И я не очень уловил, как тогда оправляются в него команды?
Фантомы можно запускать с использованием проксей
В попытке ускорить парсинг не возникала идея перенести бизнес логику парсинга в подлючаемые к фантому JS? У меня возникали большие подозрения, что это может ускорить процесс, но руки до подобной переделки уже не дошли.
Очень сомневаюсь в действительной пользе такого решения.
чем анализ данных внутри виртуального браузера
Но именно он, как я понимаю, и был использован.
Колонок что-то около десятка. При количестве строк под сотню разбор данных из этой таблицы занимал где-то минуту из PHP по webdriver с использованием достаточно простого XPath
/**
* С заданного $url загрузит информацию о заказах закупки. Вернет массив в котором элементы это заказы УЗов.
*/
public function loadOrders($url)
{
$result = array();
$this->autoLogin();
$this->_account->driver->get($url);
$this->_account->driver->wait(20)->until(\WebDriverExpectedCondition::presenceOfElementLocated(
\WebDriverBy::id('page-footer')
));
echo '[' . date('d/M/Y:H:i:s') . "] Load purchase orders from URL: «{$url}»\n";
$orders_table = $this->_account->driver->wait(10)->until(\WebDriverExpectedCondition::presenceOfElementLocated(
\WebDriverBy::xpath('//div[@id="page-body"]//div[contains(@class,"post")]//div[@class="postbody"]/div[@class="content"]/table[1]')
));
// Бежим по строкам таблицы с заказами
$orders = $orders_table->findElements(\WebDriverBy::xpath('tbody/tr[position()>1]'));
foreach ($orders as $order)
{
$order_prop_list = $order->findElements(\WebDriverBy::xpath('td'));
// [NOTE] 2015-02-21 alekciy: При изменении формата выходного массива скорректировать атрибуты модели MonitPurchaseOrder
// т.к. в OrdersMonitCommand::_load() идет массовое присвоение
$result[] = array(
'member' => mb_trim($order_prop_list[0]->getText()),
'item_name' => mb_trim($order_prop_list[1]->getText()),
'item_price' => mb_trim($order_prop_list[2]->getText()),
'item_props' => mb_trim($order_prop_list[3]->getText()),
'item_status' => mb_trim($order_prop_list[4]->getText()),
'item_status_norm' => $this->normalizeStatus($order_prop_list[4]->getText()),
);
}
return $result;
}
Что нам стоит сайт распарсить. Основы webdriver API