парсинг таблицы на PHP

123
V
На сайте с 22.09.2006
Offline
103
#11
siv1987:
Тест на производительность понятие субъективное

Не могу согласиться. Выбор технологии - вот это понятие субъективное, например, лично для меня легче поправить работающую регулярку, чем ваш код. Но я прекрасно понимаю, что это, возможно, от недостатка образованности - все-таки программирование у меня непрофильное занятие, а раз в год вникать во все детали непросто. Поэтому для оценки применяется единственный объективный критерий - скорость выполнения скрипта.

.
siv1987
На сайте с 02.04.2009
Offline
427
#12
vantala:
лично для меня легче поправить работающую регулярку, чем ваш код

Лично я, судя по первому посту, в этом сомневаюсь (хз, может вы специально убрали оттуда квантификаторы). Порой даже я в своих выражениях не могу разобраться через некоторое время, приходится вспоминать либо буквально ковырять ее по новому (иногда даже находишь более оптимальные выражения). Хотя да, чтобы поддерживать мой вариант нужно иметь представления о работе с DOM моделью, хотя бы из javascript. Скорость выполнения в парсинге далеко не самое главное, потому что обычно парсинг на "лету" встречается на часто, гораздо важнее удобочитаемость кода и легкая поддержка если вдруг на странице что-то поменяется - новый пробел, новый тег, класс. Поэтому "скорость выполнения" для меня понятие субъективное (скорость в разумных пределах конечно), особенно когда не нужно парсить на лету.

ishipilov
На сайте с 25.12.2011
Offline
101
#13

для парсинга html использую эту библиотеку:

http://simplehtmldom.sourceforge.net/

удобная вещь

V
На сайте с 22.09.2006
Offline
103
#14
siv1987:
(хз, может вы специально убрали оттуда квантификаторы)

Специально, пытался упростить выражение и поймать хоть что-то, но даже это мне не удалось :(

Не претендую на знание регулярок, но читать-править могу более-менее нормально, а вот самому написать что-то комплексное - как правило проблема.

siv1987:
Хотя да, чтобы поддерживать мой вариант нужно иметь представления о работе с DOM моделью, хотя бы из javascript.

Чего у меня, как вы догадались, нет. Я в основном программирую математические расчеты, когда в скрипте миллионы операций вычисления, на скорость приходится обращать внимание.

siv1987:
Скорость выполнения в парсинге далеко не самое главное, потому что обычно парсинг на "лету" встречается на часто

Эта штука как раз должна парсить на лету, а учитывая примерно 5000 страниц в прогоне и возможное распараллеливание, скорость явно не последнее место занимает в приоритетах.

В общем, здесь она важна :)

J
На сайте с 20.02.2014
Offline
120
jkm
#15

Ну если уж такой упор на скорость, то вот вариант вовсе без регулярок и библиотек для разбора DOM.


$str = file_get_contents('http://finance.yahoo.com/q/op?s=GDX');

$ids = array('Calls' => 'id="optionsCallsTable', 'Puts' => 'id="optionsPutsTable');

foreach ($ids as $k => $mark)
{
// Постепенно отсекаем лишнее, оставляя лишь содержимое <tbody>
$table = strstr($str, $mark, false);
$table = strstr($table, '</table>', true);
$table = strstr($table, '</thead>', false);

// Разбиваем по закрывающему тегу и не забываем удалить лишний кусок в конце.
$cells = explode('</td>', $table, -1);

// Удаляем html разметку и лишние пробелы по краям
array_walk($cells, function(&$n) { $n = trim(strip_tags($n)); } );

// Восстанавливаем структуру в 10 столбцов
$result[$k] = array_chunk($cells, 10);
}

print_r($result);

Тут используется анонимная функция и strstr с тремя параметрами, так что требуется как минимум php 5.3

V
На сайте с 22.09.2006
Offline
103
#16

Для тестирования будет использоваться код

set_time_limit(60000);
$str=file_get_contents('http://finance.yahoo.com/q/op?s=GDX');
$start=microtime(true);
for ($i = 1; $i <= 1000; $i++) {
//парсинг
//конец парсинга
}
$passed=microtime(true)-$start;
echo $passed;

Усредненный результат по трем прогонам, PHP 5.3.8

Возражения принимаются до полуночи.

$str будет переименовываться под то, что использовано в каждом решении.

W
На сайте с 09.04.2013
Offline
46
#17

Можно обойтись и вовсе без парсинга.Подобную информацию можно получить у гугла


<?php
$opt=file_get_contents("http://www.google.com/finance/option_chain?q=GOOG&output=json");
$opt =preg_replace('/(\w+)\s*:/','"$1":',$opt);
$opt=json_decode($opt);
print_r($opt->puts);
print_r($opt->calls);

и у etrade.com вроде есть api

V
На сайте с 22.09.2006
Offline
103
#18
webjey:
Можно обойтись и вовсе без парсинга.Подобную информацию можно получить у гугла

За идею спасибо, но у гугла нет данных на GDX, например. Кроме того,

this API is deprecated since 2011/26/05

а без документации сообразить как получить не текущую экспирацию, а к примеру "April 17, 2015" - пока не могу. Будем искать у кого работает...

UPD: У яхи тоже пропали данные по GDX, оказывается...

V
На сайте с 22.09.2006
Offline
103
#19

Высокое жюри вынуждено принять неожиданное для себя решение.

Тесты не проводились, поскольку потеряли смысл. Хотя я был уверен в победе jkm с вариантом на strstr, предложенный webjey вариант с API на порядок снижает объем загружаемых данных, соответственно увеличивая быстродействие, так что вопрос о скорости парсинга просто отпадает.

Что лишний раз говорит о важности широкого взгляда на задачу.

🍻 webjey - WMR в личку.

Всем участникам - спасибо, я узнал много нового, даже не ожидал.

TF-Studio
На сайте с 17.08.2010
Offline
334
#20

API всегда проще.

У финансов - навалом разных площадок.

Ищите каталоги api - найдете для себя море полезных данных нахаляву.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий