LINUX.ORG.RU

Хочу граббер

 , ,


3

1

Мне нужно вытаскивать кучу инфы с различных сайтов, нужно тупо запилить граббер.

Я собираюсь тупо запускать dom-парсер, смотреть глазами в каких элементах лежит нужная мне инфа, выдёргивать её. Всё просто.

Я вот подумал, а может в мире уже изобрели что-то более удобное? Паттерн-матчинг какой-нибудь, набор правил. Может есть какой-то приспособленный DSL для этого?

Язык и платформа — любая.

Тот самый случай, когда нужно советовать python со своим Soup.
//Хотя мб удобно будет и на Ruby, не пробовал.

anonymous
()

python + lxml

anonymous
()

Perl + Mojo::DOM + Mojo::UserAgent

bvn13 ★★★★★
()

XSLT/XPATH в в порядке уменшения страданий при повороте мозгов :) Ну и полюбопытсвовать на счет возможности проброса нативных фунций в вышеупомянутое безобразие дял твоих ЯП/сред. В принципе это даже в для лиспа можно, но кому как повезет :)

antares0 ★★★★
()

Паттерн-матчинг какой-нибудь, набор правил

Xpath называется

Goury ★★★★★
()

Ruby, Nokogiri и CSS3/Xpath селекторы во все поля.

anonymous
()

Мне нужно вытаскивать кучу инфы с различных сайтов, нужно тупо запилить граббер.

lynx -dump "различный сайт" | grep "кучу инфы" не благодари.

init_6 ★★★★★
()

Буду оригинален - Swi-Prolog. У него есть библиотека разбора HTML на DOM, а дальше ползать по DOM'у используя прологовские предикаты одно удовольствие.

Пример получения DOM'a:

:- use_module(library(http/http_open)).

http_load_html(URL, DOM) :-
	setup_call_cleanup(
		http_open(URL, In, [timeout(60)]),
		(
			dtd(html, DTD),
			load_structure(
				stream(In),
				DOM,
				[dtd(DTD), dialect(sgml), shorttag(false), max_errors(-1), syntax_errors(quiet)]
			)
		),
		close(In)).

runtime ★★★★
()
Ответ на: комментарий от runtime

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

/****************************
 Building DB
****************************/

:- dynamic node/4. % node(id, name, attributes, value)
:- dynamic link/2. % link(id, parent_id)

clear_db :-
	abolish(node/4),
	abolish(link/2).

build_db(DOM) :-
	build_db_aux(DOM, [-1], 0).

build_db_aux([], [], _).
build_db_aux(Elements, ParentIds, Id) :-
	% add current element to DB, generate new id
	Elements = [Element|Es],
	ParentIds = [Parent|Ps],
	add_to_db(Id, Element, Parent),
	% get children, set current id as their parent
	get_children(Element, Children),
	length(Children, ChildCount),
	length(ChildParentIds, ChildCount),
	maplist('='(Id), ChildParentIds),
	% process remaining elements
	Id2 is Id+1,
	append(Children, Es, Elements2),
	append(ChildParentIds, Ps, ParentIds2),
	build_db_aux(Elements2, ParentIds2, Id2).

add_to_db(Id, Elem, Parent) :-
	assert(link(Id, Parent)),
	(is_element(Elem) ->
		get_name(Elem, Name),
		get_attributes(Elem, Attributes),
		assert(node(Id, Name, Attributes, []))
		;
		Value = Elem, % Elem itself represents node contents
		assert(node(Id, [], [], Value))
	).

/****************************
 Node operations
****************************/

is_parent_of(Parent, Child) :-
	Parent = element(_, _, Children),
	member(Child, Children).

is_element(E) :-
	E =.. [element|_].

get_attribute(E, Name, Value) :-
	E = element(_, Attrs, _),
	member(Name=Value, Attrs).

get_name(E, Name) :-
	E = element(Name, _, _).

get_attributes(E, Attributes) :-
	E = element(_, Attributes, _).

get_children(E, Children) :-
	E = element(_, _, Children).
get_children(_, []) :- !.

runtime ★★★★
()
Последнее исправление: runtime (всего исправлений: 1)

Занимаюсь похожей фигней. XPATH и CSS-селекторов хватает для 100% случаев.

И да, XPATH может быть читабельным, если писать его вручную и использовать мозг, а не копировать из FireBug.

anonymous
()

Я написал на Java с помощью либ jsoup (парсинг css-селекторами и др.) и apache http client (работа с cookies), получилось быстро и просто.

xmichael
()

pyquery, особенно если знаком с jquery

pi11 ★★★★★
()
Ответ на: комментарий от runtime

Годнота, хотел насоветовать. А также, внезапно, LINQ.

buddhist ★★★★★
()
Ответ на: комментарий от antares0

А что ему делать в случае если источник не только непохож на XML, но и не является даже подобием HTML?

В общем рекомендую уделить внимание как XPath/XQuery/XSLT и подобным, так и регулякам.

Собственно копать надо в направлении XPath+Perl или XPath+JS, есть так же Python+lxml но питоновские регулярки выглядят не так красиво как перловские.

anonymous
()
Ответ на: комментарий от anonymous

А что ему делать в случае если источник не только непохож на XML, но и не является даже подобием HTML?

Если читать ТС то

нужно вытаскивать кучу инфы с различных сайтов
собираюсь тупо запускать dom-парсер

уделить внимание как XPath/XQuery/XSLT

И мое ты почему-то не читал. Вопрос только в том за чем ты на него отвечаешь :(

antares0 ★★★★
()
Последнее исправление: antares0 (всего исправлений: 2)
Ответ на: комментарий от antares0

Просто выбрал самый правильный ответ и дополнил его упоминанием о том что регулярки в грабинге могут ВНЕЗАПНО оказаться важнее работы с DOM и надо сразу брать инструмент умеющий и то и то :)

anonymous
()
5 октября 2014 г.

Нашёл очень клёвый инструмент, то что нужно: https://github.com/cheezy/page-object

Позволяет декларативно описать страницу, её элементы, и отдельно работать с ними в методах.

UPD: правда этот гем всегда использует браузер. Неудобно, если данные доступны и так, без js.

vladimir-vg ★★
() автор топика
Последнее исправление: vladimir-vg (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.