Лучшая библиотека для веб-скрейпинга
Я хотел бы получить данные с различных веб-страниц, таких как адреса ресторанов или даты различных событий для данного места и так далее. Какую лучшую библиотеку я могу использовать для извлечения этих данных из заданного набора сайтов?
13 ответов:
Если вы используете python, обратите внимание на красивый суп (http://crummy.com/software/BeautifulSoup).
Чрезвычайно способная библиотека, делает соскабливание ветерком.
HTML Agility Pack для .net-программистов-это потрясающе. Он превращает веб-страницы в XML-документы, которые можно запросить с помощью XPath.
HtmlDocument doc = new HtmlDocument(); doc.Load("file.htm"); foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href") { HtmlAttribute att = link"href"; att.Value = FixLink(att); } doc.Save("file.htm");
Вы можете найти его здесь. http://www.codeplex.com/htmlagilitypack
Я думаю, что общий ответ здесь заключается в использовании любого языка + http-библиотека + HTML / xpath парсер. Я нахожу, что использование ruby + hpricot дает хорошее чистое решение:
require 'rubygems' require 'hpricot' require 'open-uri' sites = %w(http://www.google.com http://www.stackoverflow.com) sites.each do |site| doc = Hpricot(open(site)) # iterate over each div in the document (or use xpath to grab whatever you want) (doc/"div").each do |div| # do something with divs here end end
Подробнее о Hpricot см. http://code.whytheluckystiff.net/hpricot/
Лично мне нравится модуль WWW::Mechanize Perl для таких задач. Он дает вам объект, который моделируется по образцу обычного веб-браузера (то есть вы можете переходить по ссылкам, заполнять формы или использовать кнопку "назад", вызывая методы на нем).
Для извлечения фактического содержимого вы можете подключить его к HTML:: TreeBuilder, чтобы преобразовать веб-сайт, который вы сейчас посещаете, в дерево объектовHTML::Element и извлечь нужные данные. (метод
look_down()
HTML::Element
особенно полезен).
Я думаю, что ватир или селен-лучший выбор. Большинство других упомянутых библиотек на самом деле являются синтаксическими анализаторами HTML, и это не то, что вам нужно... Вы скребете, если владелец сайта хотел, чтобы вы добрались до его данных, он поместил бы дамп своей базы данных или сайта на торрент и избежал бы всех http-запросов и дорогого трафика.
В основном, вам нужно разобрать HTML, но еще важнее автоматизировать браузер. Это до такой степени, что вы можете перемещать мышь и нажимать, в основном действительно имитируя пользователя. Вам нужно использовать программу screencapture, чтобы добраться до captchas и отправить их в decaptcha.com (которые решают их за долю цента), чтобы обойти это. забудьте о сохранении этого файла captcha, проанализировав html без отображения его в браузере "так, как он должен быть виден". Вы создаете экраны, а не httprequestscraping.
Watir сделал трюк для меня в сочетании с autoitx (для перемещения мыши и ввода клавиш в полях - > иногда это необходимо установить правильные события javascript) и простая утилита захвата экрана для captcha's. таким образом, вы будете наиболее успешны, совершенно бесполезно писать отличный HTML-парсер, чтобы узнать, что владелец сайта превратил часть текста в графику. (Проблематично? нет, просто получите библиотеку OCR и скормите jpeg, текст будет возвращен). Кроме того, я редко видел, чтобы они заходили так далеко, хотя на китайских сайтах есть много текста в графике.
Xpath спас мне весь день. время, это отличный доменный язык (IMHO, я могу ошибаться), и вы можете добраться до любого тега на странице, хотя иногда вам нужно настроить его.
Чего мне не хватало, так это "обратных шаблонов" (у робота-фреймворка selenium есть это). Perl имел это в шаблоне модуля CPAN:: Extract, очень удобно.
Синтаксический анализ html, или создание DOM, я бы оставил браузеру, да, это будет не так быстро, но он будет работать все время.
Также библиотеки, которые претендуют быть Useragents бесполезны, сайты защищены от выскабливания в настоящее время, и рендеринг сайта на реальном экране часто необходим, чтобы выйти за пределы капчи, но также и события javascript, которые должны быть вызваны для появления информации и т. д.
Watir если ты в Ruby, Selenium для остальных я бы сказал. "Человеческий эмулятор" (или веб-эмулятор в России) действительно создан для такого рода выскабливания, но опять же это российский продукт от компании, которая не делает секрета из своих возможностей. намерения.
Я также думаю, что на одной из этих недель у Уайли выходит новая книга о скребке, которая должна быть интересной. Удачи...
Я лично нахожу http://github.com/shuber/curl/tree/master и http://simplehtmldom.sourceforge.net / отлично подходит для использования в моих проектах PHP spidering/scraping.
Библиотека Perl WWW::Mechanize отлично подходит для выполнения Ослиной работы по взаимодействию с веб-сайтом, чтобы добраться до нужной вам страницы.
Я бы использовал LWP (Libwww для Perl). Вот хороший маленький гид: http://www.perl.com/pub/a/2002/08/20/perlandlwp.html
Сайт::скребок документы здесь: http://cpan.uwinnipeg.ca/htdocs/Scraper/WWW/Scraper.html Он может быть полезен в качестве базы,вы, вероятно, захотите создать свой собственный модуль, который соответствует вашим потребностям ресторанного майнинга.
LWP даст вам базовый гусеничный движок, на котором вы будете строить.
Было несколько ответов, рекомендующих Perl Mechanize, но я думаю, что Ruby Mechanize (очень похожий на версию Perl) еще лучше. Он обрабатывает некоторые вещи, такие как формы, гораздо более чистым способом синтаксически. Кроме того, есть несколько интерфейсов, которые работают поверх Ruby Mechanize, что делает вещи еще проще.
Вы можете использовать tidy, чтобы преобразовать его в XHTML, а затем использовать любые средства обработки XML, доступные вашему языку выбора.
Я бы рекомендовал BeautifulSoup . Это не самый быстрый, но работает действительно хорошо в отношении не-хорошо сформированных (X)HTML-страниц, которые большинство парсеров подавляются.