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或者只是迭代节点。
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抓取工作也很好;-)虽然看了“美丽的汤”,但我明白了为什么这是一个有价值的工具。