HTML抓取的选项?
我正在考虑尝试Beautiful Soup,这是用于HTML抓取的Python包。还有其他我应该查看的HTML抓包工具吗?不需要Python,实际上我也很想了解其他语言。
到目前为止的故事:
- xml文件
- HTQL
- cra草
- 机械化
- 杏
- 机械化
- scrAPI
- scrubyt!
- 袋熊
- 瓦蒂尔
- 瓦丁
- 网页抓取工具
- HtmlUnit
- 网络收割
- 防弹衣
- so
- Jericho HTML解析器
- 啦啦队
- 阿图
- 节点马
- 幻影
- htmlSQL
- PHP简单HTML DOM解析器
- 使用CURL进行PHP爬取
- 猩红查询
解决方案
回答
首先,我要确定所涉及的站点是否提供API服务器或者RSS Feed,以访问所需的数据。
回答
在Ruby世界中,相当于Beautiful Soup的是why_the_lucky_stiff的Hpricot。
回答
正则表达式也适用于HTML抓取;-)尽管看了Beautiful Soup,我仍然明白为什么这将是一个有价值的工具。
回答
我们可能已经拥有了很多,但是我认为这是我们想要做的:
from __future__ import with_statement import re, os profile = "" os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html') with open("myProfile.html") as f: for line in f: profile = profile + line f.close() p = re.compile('summarycount">(\d+)</div>') #Rep is found here print p m = p.search(profile) print m print m.group(1) os.system("espeak \"Rep is at " + m.group(1) + " points\"" os.remove("myProfile.html")
回答
对于Perl,有WWW :: Mechanize。
回答
我在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
差不多完成了。在此之前的所有操作都是库导入和我的代理的设置。
回答
BeautifulSoup是HTML抓取的好方法。我以前的工作是让我做很多工作,但我希望我一开始就对BeautifulSoup有所了解。就像DOM带有更多有用的选项,并且它的Pythonic一样。如果我们想尝试使用Ruby,他们会移植BeautifulSoup并将其命名为RubyfulSoup,但是它已经有一段时间没有更新了。
其他有用的工具是HTMLParser或者sgmllib.SGMLParser,它们是标准Python库的一部分。每次我们输入/退出标签并遇到html文本时,这些方法就会通过调用方法来工作。如果我们熟悉的话,他们就像Expat。如果要解析非常大的文件,并且创建DOM树将很长且昂贵,则这些库特别有用。
正则表达式不是非常必要。 BeautifulSoup处理正则表达式,因此,如果我们需要它们的功能,则可以在那里使用它。我说与BeautifulSoup一起使用,除非我们需要速度和较小的内存占用。如果我们在Python上找到了更好的HTML解析器,请告诉我。
回答
我发现HTMLSQL是一种非常简单的屏幕抓取方法。从字面上看,花费数分钟即可获得结果。
查询非常直观,例如:
SELECT title from img WHERE $class == 'userpic'
现在还有其他一些采用相同方法的替代方法。
回答
在.NET世界中,我建议使用HTML Agility Pack。虽然不如上述某些选项(例如HTMLSQL)那么简单,但是它非常灵活。它使我们可以处理格式不正确的HTML,就像处理格式正确的XML一样,因此我们可以使用XPATH或者仅在节点上进行迭代。
http://www.codeplex.com/htmlagilitypack
回答
我在Perl中使用了LWP和HTML :: TreeBuilder,并且发现它们非常有用。
LWP(libwww-perl的缩写)可让我们连接到网站并抓取HTML,我们可以在此处获取该模块,而O'Reilly的书似乎在此处在线。
TreeBuilder允许我们从HTML构造一棵树,并且HTML :: TreeBuilder Parser中提供了文档和源代码,用于构建HTML语法树。
但是,与这种方法相比,可能还有很多繁重的工作要做。我没有看另一个答案建议的"机械化"模块,因此我很可能会这样做。
回答
鞋子和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
回答
我在Python上经常使用Beautiful Soup。它比正则表达式检查要好得多,因为即使HTML格式不正确,它也可以像使用DOM一样工作。我们可以使用比正则表达式更简单的语法快速找到HTML标记和文本。一旦找到一个元素,就可以遍历该元素及其子元素,这对于理解代码中的内容比使用正则表达式更为有用。我希望"美丽的汤"存在于多年前,当时我必须进行大量的屏幕抓图-因为HTML结构在人们开始对其进行验证之前太差了,它将为我节省很多时间和头痛。
回答
在Java中,我们可以使用TagSoup。
回答
Scrubyt使用Ruby和Hpricot进行简单轻松的Web抓取。我用大约30分钟的时间为我的大学图书馆服务写了一张刮板。
回答
Perl的另一个选择是基于Ruby的Scrapi的Web :: Scraper。简而言之,使用简洁明了的语法,我们可以将健壮的抓取工具直接放入数据结构中。
回答
尽管它是为.NET Web测试而设计的,但我一直为此目的而使用WatiN框架。由于它是基于DOM的,因此捕获HTML,文本或者图像非常容易。最近,我用它将MediaWiki所有页面名称空间查询中的链接列表转储到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
回答
我使用SgmlReader在.NET中混合了各种结果,而SgmlReader最初是由克里斯·洛维特(Chris Lovett)启动的,似乎已由MindTouch更新。
回答
我在Java中使用HtmlUnit取得了一些成功。这是一个用于在Web UI上编写单元测试的简单框架,但对于HTML抓取同样有用。
回答
Python lxml库充当libxml2和libxslt库的Pythonic绑定。我特别喜欢它的XPath支持和内存XML结构的精美打印。它还支持解析损坏的HTML。而且我认为我们找不到其他比lxml解析XML更快的Python库/绑定。
回答
如果不使用Perl,我们将是个傻瓜。
加固以下模块,然后将人参刮伤。
use LWP use HTML::TableExtract use HTML::TreeBuilder use HTML::Form use Data::Dumper
回答
来自Django的Adrian Holovaty的templatemaker实用程序使用了一种非常有趣的方法:向它提供同一页面的变体,并且它"学习"可变数据的"漏洞"所在的位置。它不是特定于HTML的,因此也适用于抓取其他任何纯文本内容。我还将它用于转换为纯文本的PDF和HTML(分别使用pdftotext和lynx)。
回答
HTML5解析算法的实现:html5lib(Python,Ruby),Validator.nu HTML解析器(Java,JavaScript;开发中的C ++),Hubbub(C),Twintsam(C#;即将推出)。
回答
使用Aptana的Jaxer + jQuery解析页面也取得了很大的成功。它本质上不像"脚本"那样快或者"像脚本一样",但是jQuery选择器+真正的JavaScript / DOM是更复杂(或者格式错误)页面上的救命稻草。
回答
.NET的另一个工具是MhtBuilder
回答
"简单HTML DOM解析器"对于PHP是一个不错的选择,如果我们熟悉jQuery或者JavaScript选择器,那么我们将发现自己在家里。
在这里找到
这里也有关于它的博客文章。
回答
我知道并喜欢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.
回答
Python除了Beatiful Soup之外,还有多种HTML抓取选项。以下是一些其他内容:
- 机械化:类似于perl
WWW:Mechanize
。为我们提供类似浏览器的对象以与网页保持一致 - lxml:Python绑定到
libwww
。支持遍历和选择元素的各种选项(例如XPath和CSS选择) - scrapemark:使用模板从HTML提取信息的高级库。
- pyquery:使我们可以像在XML文档上进行jQuery一样进行查询。
- scrapy:一个高级的抓取和Web爬网框架。它可以用来编写蜘蛛,用于数据挖掘以及监视和自动测试
回答
对于更复杂的抓取应用程序,我建议使用IRobotSoft Web抓取器。它是用于屏幕抓取的专用免费软件。它具有用于HTML页面的强大查询语言,并且提供了非常简单的Web记录界面,使我们无需进行很多编程工作。
回答
我喜欢Google Spreadsheets的ImportXML(URL,XPath)函数。
如果XPath表达式返回多个值,它将在列下重复单元格。
一个电子表格上最多可以有50个importxml()
函数。
RapidMiner的Web插件也非常易于使用。它可以发布消息,接受cookie并可以设置用户代理。
回答
Dav Glass最近的演讲欢迎来到丛林! (YUIConf 2011开幕主题演讲)展示了如何在Node.js上使用YUI 3在服务器上进行类似于客户端的编程(使用DOM选择器而不是字符串处理)。非常令人印象深刻。
回答
我在图书馆使用Feedity http://feedity.com进行某些抓取工作(并将其转换为RSS feed)。它适用于大多数网页。
回答
夏普查询
基本上是C#的jQuery。它依赖于HTML Agility Pack来解析HTML。