12

我想从不同的网页获取数据,例如餐厅地址或给定位置的不同事件的日期等。我可以用来从一组给定的站点中提取这些数据的最佳库是什么?

4

13 回答 13

10

.net 程序员的 HTML 敏捷包非常棒。它将网页转换成可以使用 XPath 查询的 XML 文档。

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

于 2008-09-15T21:30:23.720 回答
10

如果使用 python,请查看 Beautiful Soup ( http://crummy.com/software/BeautifulSoup )。

一个功能非常强大的库,让抓取变得轻而易举。

于 2008-09-15T21:41:48.777 回答
4

我认为这里的一般答案是使用任何语言 + 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/

于 2008-09-15T21:28:17.670 回答
3

我个人喜欢用于这类任务的WWW::Mechanize Perl 模块。它为您提供了一个以典型 Web 浏览器为模型的对象(即您可以跟踪链接、填写表格或通过调用其上的方法来使用“后退按钮”)。

对于实际内容的提取,您可以将其连接到HTML::TreeBuilder以将您当前正在访问的网站转换为HTML::Element对象树,并提取您想要的数据(look_down()方法HTML::Element特别是有用)。

于 2008-09-15T21:32:38.847 回答
3

我认为 watir 或 selenium 是最好的选择。大多数其他提到的库实际上是 HTML 解析器,这不是你想要的......你正在抓取,如果网站的所有者希望你获取他的数据,他会转储他的数据库或网站洪流并避免所有http请求和昂贵的流量。

基本上,您需要解析 HTML,但更重要的是自动化浏览器。这可以移动鼠标并单击,基本上是在模仿用户。您需要使用屏幕捕获程序来获取验证码并将它们发送到 decaptcha.com(以几分之一的成本解决它们)以规避这种情况。忘记通过解析html而不在浏览器中呈现它'应该看到'来保存该验证码文件。您是屏幕抓取,而不是 httprequestscraping。

watir 结合 autoitx(用于移动鼠标并在字段中输入键 -> 有时这是设置正确的 javascript 事件所必需的)和用于验证码的简单屏幕捕获实用程序为我做了这个伎俩。这样你会最成功,编写一个很棒的 html 解析器来发现站点的所有者已经将一些文本变成了图形是毫无用处的。(有问题?不,只需获取一个 OCR 库并输入 jpeg,将返回文本)。此外,我很少看到他们走那么远,尽管在中文网站上,图形中有很多文字。

Xpath 一直在拯救我的一天,它是一种很棒的领域特定语言(恕我直言,我可能错了),您可以访问页面中的任何标签,尽管有时您需要对其进行调整。

我确实错过了“反向模板”(selenium 的机器人框架有这个)。Perl 在 CPAN 模块 Template::Extract 中有这个,非常方便。

html 解析或 DOM 的创建,我会留给浏览器,是的,它不会那么快,但它会一直工作。

假装是用户代理的库也没有用,现在网站受到保护以防被抓取,并且通常需要在真实屏幕上呈现网站以超越验证码,而且还需要触发 javascript 事件以显示信息等.

Watir 如果你喜欢 Ruby,我会说 Selenium。“人类模拟器”(或俄罗斯的 Web 模拟器)确实是为这种抓取而设计的,但话又说回来,它是来自一家毫不掩饰其意图的公司的俄罗斯产品。

i also think that one of these weeks Wiley has a new book out on scraping, that should be interesting. Good luck...

于 2012-02-07T19:14:50.797 回答
2

我个人觉得http://github.com/shuber/curl/tree/masterhttp://simplehtmldom.sourceforge.net/非常适合在我的 PHP 爬取/抓取项目中使用。

于 2009-02-26T10:09:13.553 回答
1

Perl WWW::Mechanize库非常适合完成与网站交互以访问您需要的实际页面的笨拙工作。

于 2008-09-15T21:22:49.167 回答
1

我会使用 LWP(Perl 的 Libwww)。这是一个很好的小指南: http ://www.perl.com/pub/a/2002/08/20/perlandlwp.html

WWW::Scraper 在这里有文档:http: //cpan.uwinnipeg.ca/htdocs/Scraper/WWW/Scraper.html 它可以作为一个有用的基础,你可能想要创建适合你的餐厅采矿的自己的模块需要。

LWP 将为您提供一个基本的爬虫供您构建。

于 2008-09-15T21:24:55.417 回答
1

有很多答案推荐 Perl Mechanize,但我认为 Ruby Mechanize(与 Perl 的版本非常相似)更好。它在句法上以更简洁的方式处理诸如表单之类的事情。此外,还有一些前端运行在Ruby Mechanize之上,这让事情变得更加容易。

于 2008-09-15T21:43:26.730 回答
0

你想使用什么语言?

使用 awk 卷曲可能就是您所需要的。

于 2008-09-15T21:20:09.423 回答
0

您可以使用tidy将其转换为 XHTML,然后使用您选择的语言可用的任何 XML 处理工具。

于 2008-09-15T21:22:30.523 回答
0

我推荐BeautifulSoup。它不是最快的,但在大多数解析器窒息的 (X)HTML 页面的非格式方面表现得非常好。

于 2008-09-15T21:22:58.340 回答
0

有人说什么。

使用任何语言。

只要你有一个好的解析器库和 http 库,你就设置好了。

树的东西比较慢,然后只使用一个好的解析库。

于 2009-03-05T23:56:03.833 回答