HTML抓取的选项?

我正在考虑尝试Beautiful Soup ,一个用于HTML抓取的Python包。 还有其他的HTML抓取包我应该看? Python不是必需的,我其实也对其他语言感兴趣。

迄今为止的故事:

  • python
    • 美丽的汤
    • LXML
    • HTQL
    • Scrapy
    • 机械化
  • ruby
    • 引入nokogiri
    • angular度来说,Hpricot
    • 机械化
    • scrAPI
    • scRUBYt!
    • 袋熊
    • 的Watir
  • 。净
    • Html敏捷包
    • 华廷
  • Perl的
    • WWW ::机械化
    • 网页式铲运机
  • Java的
    • 标签汤
    • 的HtmlUnit
    • networking丰收
    • jARVEST
    • jsoup
    • 杰里科HTMLparsing器
  • JavaScript的
    • 请求
    • cheerio
    • artoo
    • 节点骑手
    • phantomjs
  • PHP
    • GOUTTE
    • htmlSQL
    • PHP简单的HTML DOMparsing器
    • PHP用CURL刮擦
  • 他们中的大多数
    • 屏幕刮板

Ruby世界相当于美丽的汤是why_the_lucky_stiff的Hpricot 。

在.NET世界中,我推荐HTML敏捷包。 不像上面的一些选项(比如HTMLSQL)那么简单,但是非常灵活。 它可以让你形成格式不完整的HTML,就好像它是格式良好的XML,所以你可以使用XPATH或者只是迭代节点。

http://www.codeplex.com/htmlagilitypack

BeautifulSoup是一个伟大的方式去HTML刮。 我以前的工作让我做了很多的刮擦,我希望当我开始时我知道BeautifulSoup。 这就像DOM有更多的有用的select,是pythonic更多。 如果你想尝试Ruby,他们移植的BeautifulSoup称它为RubyfulSoup,但它一直没有更新。

其他有用的工具是HTMLParser或sgmllib.SGMLParser,它们是标准Python库的一部分。 这些工作通过调用方法每次你input/退出标签,遇到HTML文本。 他们就像Expat,如果你熟悉的话。 如果您要parsing非常大的文件,创buildDOM树会很长并且很昂贵,这些库特别有用。

正则expression式不是非常必要的。 BeautifulSoup处理正则expression式,所以如果你需要他们的权力,你可以在那里使用它。 我说去BeautifulSoup,除非你需要速度和更小的内存占用。 如果您在Python上find了更好的HTMLparsing器,请告诉我。

我发现HTMLSQL是一个可笑的简单的方法来screenscrape。 花费几分钟的时间才能得到结果。

查询是超级直观的 – 就像:

SELECT title from img WHERE $class == 'userpic' 

现在有一些其他的select采取相同的方法。

对于Perl,有WWW :: Mechanize。

Python lxml库充当libxml2和libxslt库的Pythonic绑定。 我特别喜欢它的XPath支持和漂亮的内存XML结构的打印。 它也支持parsing破碎的HTML。 我不认为你可以find比lxml更快地parsingXML的其他Python库/绑定。

“简单的HTML DOM分析器”是PHP的一个很好的select,如果你熟悉jQuery或JavaScriptselect器,那么你会发现自己在家里。

在这里find它

这里也有一篇关于它的博客文章。

为什么没有人提到Java的JSOUP呢? http://jsoup.org/

除了美丽的汤,Python还提供了多种用于HTML抓取的选项。 这里有一些其他的:

  • 机械化 :类似于Perl WWW:Mechanize 。 给你一个类似浏览器的浏览器,以便与网页互动
  • lxml :Python绑定到libwww 。 支持遍历和select元素的各种选项(例如XPath和CSSselect)
  • scrapemark :使用模板从HTML中提取信息的高级库。
  • pyquery :允许您在XML文档上制作类似于jQuery的查询。
  • scrapy :高级别的抓取和网页爬虫框架。 它可以用来编写蜘蛛,用于数据挖掘和监视和自动化testing

来自Adrian Holovaty( Django成名)的templatemaker实用程序使用了一个非常有趣的方法:将同一页面的变体提供给它,并“学习”variables数据的“空洞”。 这不是特定于HTML的,所以它也适用于任何其他明文内容。 我也用它的PDF和HTML转换为明文(分别与pdftotext和lynx)。

我知道和喜欢屏幕刮刀 。

Screen-Scraper是从网站提取数据的工具。 Screen-Scraper自动化:

 * Clicking links on websites * Entering data into forms and submitting * Iterating through search result pages * Downloading files (PDF, MS Word, images, etc.) 

常见用途:

 * Download all products, records from a website * Build a shopping comparison site * Perform market research * Integrate or migrate data 

技术:

 * Graphical interface--easy automation * Cross platform (Linux, Mac, Windows, etc.) * Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.) * Runs on workstations or servers 

屏幕刮板的三个版本:

 * Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled. * Professional: Designed to be capable of handling most common scraping projects. * Basic: Works great for simple projects, but not nearly as many features as its two older brothers. 

我首先要查明有问题的网站是否提供API服务器或RSS源来访问你所需要的数据。

刮擦堆栈溢出对于鞋子和Hpricot尤其容易。

 require 'hpricot' Shoes.app :title => "Ask Stack Overflow", :width => 370 do SO_URL = "http://stackoverflow.com" stack do stack do caption "What is your question?" flow do @lookup = edit_line "stackoverflow", :width => "-115px" button "Ask", :width => "90px" do download SO_URL + "/search?s=" + @lookup.text do |s| doc = Hpricot(s.response.body) @rez.clear() (doc/:a).each do |l| href = l["href"] if href.to_s =~ /\/questions\/[0-9]+/ then @rez.append do para(link(l.inner_text) { visit(SO_URL + href) }) end end end @rez.show() end end end end stack :margin => 25 do background white, :radius => 20 @rez = stack do end end @rez.hide() end end 

我已经用Java中的HtmlUnit取得了一些成功。 这是一个在Web UI上编写unit testing的简单框架,但同样适用于HTML抓取。

雅虎 查询语言或YQL可以与jQuery,AJAX,JSONP一起使用来屏蔽刮网页

Perl的另一个select是基于Ruby的Scrapi的 Web :: Scraper 。 简而言之,用简洁明了的语法,您可以直接获得一个强大的刮板数据结构。

另一个.NET工具是MhtBuilder

也有这个解决scheme: netty HttpClient

我在Ruby上使用Hpricot。 作为一个例子,这是我用来从HireThings帐户的六个页面中检索所有书名的代码片段(因为它们似乎没有提供包含此信息的单个页面):

 pagerange = 1..6 proxy = Net::HTTP::Proxy(proxy, port, user, pwd) proxy.start('www.hirethings.co.nz') do |http| pagerange.each do |page| resp, data = http.get "/perth_dotnet?page=#{page}" if resp.class == Net::HTTPOK (Hpricot(data)/"h3 a").each { |a| puts a.innerText } end end end 

这是非常完整的。 所有这之前是库导入和我的代理设置。

我用了很多美丽的汤。 它比正则expression式检查好得多,因为它像使用DOM一样工作,即使HTML格式不正确。 您可以使用比正则expression式更简单的语法快速查找HTML标记和文本。 一旦find一个元素,就可以遍历它和它的子元素,这对于理解代码中的内容比使用正则expression式更有用。 我希望多年前的“美丽的汤”,当时我不得不进行大量的屏幕扫描,因为在人们开始validationHTML结构之前,HTML结构非常糟糕,所以这会节省很多时间和头痛。

虽然它是为.NETnetworkingtesting而devise的,但我一直在使用WatiN框架来达到这个目的。 由于它是基于DOM的,所以很容易捕获HTML,文本或图像。 最近,我用它来从MediaWiki All Pages命名空间查询转储一个链接列表到一个Excel电子表格。 下面的VB.NET代码片段是相当粗糙的,但它的工作原理。


 Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet) Dim PagesLink As Link For Each PagesLink In PagesIE.TableBodies(2).Links With MyWorkSheet .Cells(XLRowCounterInt, 1) = PagesLink.Text .Cells(XLRowCounterInt, 2) = PagesLink.Url End With XLRowCounterInt = XLRowCounterInt + 1 Next End Sub 

HTML5parsingalgorithm的实现 : html5lib (Python,Ruby), Validator.nu HTML Parser (Java,JavaScript;开发中的C ++), Hubbub (C), Twintsam (C#;即将推出)。

你会愚蠢的不使用Perl ..这里来的火焰..

在下面的模块和ginsu刮上任何刮擦。

 use LWP use HTML::TableExtract use HTML::TreeBuilder use HTML::Form use Data::Dumper 

我用Perl和LWP和HTML :: TreeBuilder ,发现它们非常有用。

LWP(libwww-perl的简称)可以让你连接到网站并抓取HTML, 你可以在这里获得模块 ,O'Reilly的书似乎在这里上网 。

TreeBuilder允许你从HTML中构build一棵树, 文档和源代码可以在HTML :: TreeBuilder – Parser中使用,它构build了一个HTML语法树

尽pipe如此,可能还有太多沉重的工作要做。 我没有看过由另一个答案build议的机械化模块 ,所以我可以做到这一点。

在Java中,你可以使用TagSoup 。

那么,如果你想从客户端使用只有浏览器,你有jcrawl.com完成 。 在从Web应用程序( http://www.jcrawl.com/app.html )devise了废弃服务之后,您只需将生成的脚本添加到HTML页面即可开始使用/显示数据。

所有的报废逻辑通过JavaScript在浏览器上发生。 希望对你有帮助。 点击这个链接可以看到一个从雅虎网球中提取最新消息的实例。

我在.NET中使用了SgmlReader,它最初是由Chris Lovett创build的,而且似乎已经被MindTouch更新了。

我喜欢Google Spreadsheets的ImportXML(URL,XPath)function。

如果您的XPathexpression式返回多个值,它将在列的下方重复单元格。

一个电子表格中最多可以有50个importxml()函数。

RapidMiner的Web插件也很容易使用。 它可以做文章,接受cookies,并可以设置用户代理 。

使用Aptana的Jaxer + jQueryparsing页面也取得了巨大的成功。 它本质上并不像脚本那样快,但是jQueryselect器+真正的JavaScript / DOM是更加复杂(或畸形)页面的救星。

正则expression式对于HTML抓取工作也很好;-)虽然看了“美丽的汤”,但我明白了为什么这是一个有价值的工具。