我正在考虑尝试Beautiful Soup,一个用于HTML抓取的Python包。我应该看看还有其他HTML抓包吗? Python不是必需的,我实际上也有兴趣了解其他语言。
到目前为止的故事:
答案 0 :(得分:61)
Ruby世界相当于Beautiful Soup是why_the_lucky_stiff的Hpricot。
答案 1 :(得分:42)
在.NET世界中,我推荐HTML Agility Pack。不像上面的一些选项(如HTMLSQL)那么简单,但它非常灵活。它可以让你简单地形成HTML,好像它是格式良好的XML,所以你可以使用XPATH或只是迭代节点。
答案 2 :(得分:35)
BeautifulSoup是一种很好的HTML抓取方式。我以前的工作让我做了很多刮,我希望当我开始时我知道BeautifulSoup。它就像DOM有更多有用的选项,而且更加pythonic。如果你想尝试Ruby,他们移植了BeautifulSoup,称之为RubyfulSoup,但它暂时没有更新。
其他有用的工具是HTMLParser或sgmllib.SGMLParser,它们是标准Python库的一部分。这些工作通过每次进入/退出标签并遇到html文本时调用方法。如果你熟悉它们,他们就像Expat。如果要解析非常大的文件并且创建DOM树会很长且很昂贵,这些库特别有用。
正则表达式不是很必要。 BeautifulSoup处理正则表达式,所以如果你需要它们的力量,你可以在那里使用它。除非你需要速度和更小的内存占用,否则我说要使用BeautifulSoup。如果您在Python上找到更好的HTML解析器,请告诉我。
答案 3 :(得分:19)
我发现HTMLSQL是一种非常简单的屏幕抓取方式。使用它需要几分钟才能得到结果。
查询非常直观 - 例如:
SELECT title from img WHERE $class == 'userpic'
现在有一些其他选择采用相同的方法。
答案 4 :(得分:17)
Python lxml库充当libxml2和libxslt库的Pythonic绑定。我特别喜欢它的XPath支持和内存中XML结构的漂亮打印。它还支持解析损坏的HTML。而且我认为你不能找到比lxml更快解析XML的其他Python库/绑定。
答案 5 :(得分:16)
对于Perl,有WWW :: Mechanize。
答案 6 :(得分:13)
除了Beatiful Soup之外,Python还有几种HTML抓取选项。以下是其他一些内容:
答案 7 :(得分:12)
为什么还没有人提到JSOUP用于Java? http://jsoup.org/
答案 8 :(得分:12)
'简单的HTML DOM Parser'是PHP的一个很好的选择,如果您熟悉jQuery或JavaScript选择器,那么您会发现自己在家。
答案 9 :(得分:10)
来自Adrian Holovaty(templatemaker成名)的Django实用程序使用了一种非常有趣的方法:您可以将相同页面的变体提供给它并“学习”可变数据的“漏洞”所在的位置。它不是特定于HTML的,因此也可以抓取任何其他纯文本内容。我也将它用于PDF和HTML转换为明文(分别用pdftotext和lynx)。
答案 10 :(得分:8)
我知道并且喜欢Screen-Scraper。
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.
答案 11 :(得分:8)
我首先会查看相关网站是否提供API服务器或RSS源以访问您需要的数据。
答案 12 :(得分:7)
Perl的另一个选项是Web::Scraper,它基于Ruby的Scrapi。简而言之,通过简洁明了的语法,您可以直接在数据结构中获得强大的scraper。
答案 13 :(得分:6)
使用Shoes和Hpricot抓取Stack Overflow特别容易。
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
答案 14 :(得分:6)
答案 15 :(得分:6)
我在Java中使用HtmlUnit取得了一些成功。它是在Web UI上编写单元测试的简单框架,但对HTML抓取同样有用。
答案 16 :(得分:5)
也有这个解决方案:netty HttpClient
答案 17 :(得分:5)
.NET的另一个工具是MhtBuilder
答案 18 :(得分:4)
我在Python中经常使用Beautiful Soup。它比正则表达式检查要好得多,因为它就像使用DOM一样,即使HTML格式不正确也是如此。您可以使用比正则表达式更简单的语法快速查找HTML标记和文本。一旦找到一个元素,就可以迭代它及其子元素,这对于理解代码中的内容比使用正则表达式更有用。我希望美丽的汤在几年前就已经存在了,当时我不得不做大量的屏幕分析 - 这会让我节省很多时间和头痛,因为HTML结构在人们开始验证之前是如此糟糕。
答案 19 :(得分:4)
我在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
它非常完整。之前的所有内容都是库导入和我的代理的设置。
答案 20 :(得分:4)
虽然它是专为.NET网络测试而设计的,但我一直在使用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
答案 21 :(得分:3)
HTML5 parsing algorithm的实现:html5lib(Python,Ruby),Validator.nu HTML Parser(Java,JavaScript;开发中的C ++),Hubbub(C),{{3 (C#;即将发布)。
答案 22 :(得分:3)
我在Perl中使用了LWP和HTML::TreeBuilder,发现它们非常有用。
LWP(libwww-perl的缩写)可让您连接到网站并抓取HTML,you can get the module here和O'Reilly图书seems to be online here。
TreeBuilder允许您从HTML构建树,以及documentation and source are available in HTML::TreeBuilder - Parser that builds a HTML syntax tree。
虽然这种方法可能还有太多繁重的工作。我没有看过另一个答案提出的Mechanize module,所以我可能会这样做。
答案 23 :(得分:3)
好吧,如果您希望仅使用浏览器从客户端完成jcrawl.com。在从Web应用程序(http://www.jcrawl.com/app.html)设计了报废服务之后,您只需将生成的脚本添加到HTML页面即可开始使用/显示您的数据。
所有报废逻辑都通过JavaScript在浏览器上进行。希望对你有帮助。点击此链接可获取提取latest news from Yahoo tennis。
的实际示例答案 24 :(得分:3)
如果不使用Perl,那将是一个傻瓜..这就是火焰......
将以下模块和ginsu搞砸了。
use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
答案 25 :(得分:3)
在Java中,您可以使用TagSoup。
答案 26 :(得分:2)
我使用Aptana的Jaxer + jQuery解析页面也取得了很大的成功。它本质上不是那么快或“类似脚本”,但jQuery选择器+真正的JavaScript / DOM是更复杂(或格式错误)页面的救星。
答案 27 :(得分:2)
我使用SgmlReader在.NET中得到了混合结果,该结果最初由Chris Lovett启动,似乎已由MindTouch更新。
答案 28 :(得分:2)
你可能已经拥有了很多,但我认为这就是你要做的事情:
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")
答案 29 :(得分:2)
我喜欢Google Spreadsheets的ImportXML(URL,XPath)功能。
如果您的XPath表达式返回多个值,它将在列中重复单元格。
您可以在一个电子表格中拥有最多50个importxml()
个功能。
RapidMiner的Web插件也很容易使用。它可以发布帖子,接受cookie,并可以设置user-agent。
答案 30 :(得分:1)
我一直在使用Feedity - http://feedity.com在我的图书馆进行一些抓取工作(以及转换为RSS Feed)。它适用于大多数网页。
答案 31 :(得分:1)
我为网页抓取创建了一个非常好的库Internet Tools。
我们的想法是将模板与网页相匹配,网页将从页面中提取所有数据,并验证页面结构是否保持不变。
因此,您只需获取要处理的网页的HTML,删除所有动态或不相关的内容,并注释有趣的部分。
E.g。 stackoverflow.com索引页面上的新问题的HTML是:
<div id="question-summary-11326954" class="question-summary narrow">
<!-- skipped, this is getting too long -->
<div class="summary">
<h3><a title="Some times my tree list have vertical scroll ,then I scrolled very fast and the tree list shivered .Have any solution for this.
" class="question-hyperlink" href="/questions/11326954/about-scroll-bar-issue-in-tree">About Scroll bar issue in Tree</a></h3>
<!-- skipped -->
</div>
</div>
因此,您只需删除此特定ID,标题和摘要,即可创建一个模板,该模板将读取标题,摘要,链接数组中的所有新问题:
<t:loop>
<div class="question-summary narrow">
<div class="summary">
<h3>
<a class="question-hyperlink">
{title:=text(), summary:=@title, link:=@href}
</a>
</h3>
</div>
</div>
</t:loop>
当然它还支持基本技术,CSS 3选择器,XPath 2和XQuery 1表达式。
唯一的问题是,我是如此愚蠢,使它成为一个Free Pascal库。但也有语言独立web demo。
答案 32 :(得分:1)
正则表达式也适用于HTML抓取;-)虽然看过Beautiful Soup后,我可以看出为什么这将是一个有价值的工具。
答案 33 :(得分:1)
我做了很多高级网页抓取,所以想要完全控制我的堆栈并理解其局限性。结果是This webscraping library。
答案 34 :(得分:1)
Scrubyt使用Ruby和Hpricot进行简单的网页抓取。我用大约30分钟的时间为我大学的图书馆服务写了一个刮刀。
答案 35 :(得分:1)
Dav Glass最近的演讲 Welcome to the Jungle! (YUIConf 2011 Opening Keynote) 展示了如何在 YUI上使用 Node.js 3 在服务器上进行类似客户端的编程(使用DOM选择器而不是字符串处理)。这是非常令人印象深刻的。
答案 36 :(得分:1)
对于更复杂的抓取应用程序,我建议使用IRobotSoft网络刮刀。它是一个专门用于屏幕抓取的免费软件。它具有强大的HTML页面查询语言,它提供了一个非常简单的Web录制界面,可以让您免于许多编程工作。
答案 37 :(得分:0)
对于那些更喜欢图形工作流工具的人来说,RapidMiner(FOSS)有一个很好的网络抓取和抓取工具。
以下是一系列视频:
http://vancouverdata.blogspot.com/2011/04/rapidminer-web-crawling-rapid-miner-web.html
答案 38 :(得分:0)
答案 39 :(得分:-1)
它基本上是C#的jQuery。它取决于HTML Agility Pack来解析HTML。