从网络delphi中提取信息的最佳方式



我想知道是否有比解析我搜索的HTML更好的方法从网页中提取信息。即:从"imdb.com"中提取电影评级

我目前正在使用IndyHttp组件来获取页面,并使用strUtils来解析文本,但内容有限。

我发现简单的正则表达式在处理好的网站时非常直观和简单,IMDB是一个好的网站。

例如,IMDB的电影HTML页面上的电影评级在具有class="star-box-giga-star"<DIV>中。使用正则表达式提取它非常容易。下面的正则表达式将从原始HTML中提取电影评级到捕获组1:

star-box-giga-star[^>]*>([^<]*)<

它不漂亮,但它能起作用。正则表达式查找"星盒giga-star"类id,然后查找终止DIV>,然后捕获所有内容,直到出现以下<。要创建这样的新正则表达式,您应该使用允许检查元素(例如Crome或Opera)的web浏览器。使用Chrome,您只需查看网页,右键单击要捕获的元素并执行Inspect element,然后四处查找可用于创建良好正则表达式的易于识别的元素。在这种情况下,"star-box-giga-star"类显然很容易识别!在好的网站上找到这样的可识别元素通常不会有问题,因为好的网站使用CSS,而CSS需要IDclass能够正确地设置元素的样式。

处理RSS提要更舒适。

截至发布时,网站上唯一可用的RSS订阅源是:

  • 出生日期
  • 死亡日期
  • 每日民意调查

然而,你可以通过与服务台联系来打电话添加一个新的。

RSS提要处理资源:

  • SO上的相关帖子
  • 超级对象
  • 维基百科

在抓取网站时,不能依赖信息的可用性。IMDB可能会检测到你的抓取并试图阻止你,或者他们可能会频繁更改格式以使其更加困难。

因此,您应该始终尝试使用受支持的API或RSS提要,或者至少从网站获得权限来聚合他们的数据,并确保您遵守他们的条款。通常,您将不得不为这种类型的访问付费。未经许可擅自删除网站可能会使您在几个法律方面承担责任(拒绝服务和知识产权)。

以下是IMDB的声明:

您不能使用数据挖掘、机器人、屏幕抓取或类似功能我们网站上的在线数据收集和提取工具。

要回答您的问题,最好的方法是使用网站提供的方法。对于非商业用途,如果你遵守他们的条款,你可以直接下载IMDB数据库,并使用那里的数据,而不是抓取他们的网站。只需频繁更新数据库,这是一个比抓取网站更好的解决方案。你甚至可以把你自己的网站API包起来。评分可以作为一个独立的表格。

使用HTML Tidy将任何HTML转换为有效的XML,然后使用XML解析器,可能使用XPATH或开发自己的代码(这就是我所做的)。

所有发布的答案都很好地涵盖了您的一般问题。我通常遵循类似于Cosmin详细介绍的策略。我使用wininet和regex来满足大多数web提取需求。

但是,让我在提取imdb资格的具体子问题上加上我的两分钱。IMDBAPI.COM提供了一个返回json代码的查询接口,对于这种类型的搜索非常方便。

因此,获得imdb评级的一个非常简单的命令行程序是…

program imdbrating;
{$apptype console}
uses htmlutils;
function ExtractJsonParm(parm,h:string):string;
 var r:integer;
 begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then 
    result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
  else
    result:='N/A';
 end;
    
var h:string;
begin
  h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
  writeln(ExtractJsonParm('Rating',h));
end.

如果您正在爬网的页面是有效的XML,我将使用SimpleXML来提取信息。效果不错。

资源:

  • 下载链接

相关内容

  • 没有找到相关文章

最新更新