【发布时间】:2015-01-13 07:15:06
【问题描述】:
我们有一个每周抓取数十万页的抓取工具。目前要从爬取的 HTML 中获取数据,我们手动查看 HTML 并看到“好的,数据 A 在 <div class=".info-list"> 内,数据 B 在 <h1> 内”,然后我们使用解析器解析数据来自那些 div 的。
我想这对于大多数人来说是解析爬取的 HTML 最常用的方法,但这意味着我们必须知道我们爬取的所有页面和域的 HTML 结构。所以它的可扩展性不是很好。
如果我们能弄清楚“主要内容”是什么div,这样我们就可以忽略“相关产品”或“相关文章”或“主菜单”等其他内容,我们可以轻松解析以与我们现在相同的方式获取数据,但不必指定每个数据的确切 div 名称和位置。
那么...我们如何确定哪个是页面的“主 div”?
我很确定 Google 会这样做。他们肯定知道页面上元素的位置,以及某些内容是否位于“主要内容”或页脚中。他们怎么会知道呢?
我可以看到的大规模执行此操作的方法是:
渲染页面并寻找最大的 div 并从那里开始。但是渲染数百万或数十万页并不是真正的廉价和高效。
-
尝试从每个 div 的内容中找出它。例如,其中包含最多链接的 div 可能是菜单。其中包含最多文本的 div 可能是主要内容。但是如果内容是这样的,这会变得非常棘手:
<body> <div class="maincontent"> <div class="post-header"> <h1>Header of post</h1> </div> <div class="short-description"> Hello World! </div> <div class="long-description"> Hello New World! </div> </div> </body>显然我们想要识别为“主要内容”的 div 是
<div class="maincontent">。但是,如果我们寻找具有“最多文本”的 div。应该是.long-description。
这开始成为一个相当长的问题。但我的观点是,很难确定网站的哪个部分是“主要内容”。我正在请任何聪明的人帮助我想出一种体面的方法来找出哪些 div 或哪些 div 可能包含页面中最重要的内容。
编辑:我想渲染它的一种方法不是渲染每一页。但是要渲染域。例如。如果域结构是http://example.com/post/1-post-name/,我可以保存它的渲染,下次我找到http://example.com/post/2-post-name/ 的页面时,我知道它可能与第一个具有相同的 HTML 模板,并且“最大的 div”是可能是一样的。
那么做这个服务器端的技术是什么?我的意思是渲染它并保存所有元素的大小和位置。我想这似乎是一种相当不错的大规模实施方式。
【问题讨论】:
标签: html parsing web-crawler