我们有一个爬虫程序,每周爬行数十万个页面。目前,为了从抓取的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“可能是相同的。那么服务器方面做什么技术呢?我的意思是渲染它并保存所有元素的大小和位置。我想这似乎是一个相当不错的大规模做法。
答案 0 :(得分:0)
我会尝试多种方法。例如,从显而易见开始 - 是id="content"
还是class="main_content"
?用它!查找大内容块常见的id和类,如果存在,则使用它们。如果没有,那么继续进行不太确定的测试。
接下来尝试缩小范围。有<header>
或<nav>
标记吗?忽略它和它上面的一切。忽略<footer>
或类=&#34;侧边栏&#34;
制定一些规则,让它们运行,然后手动预期返回的内容,并在您拉扯太多或遗漏某些东西时寻找模式。调整规则并根据它编写新规则。
此时你甚至可以让那些人通过你所有的测试进入一个简短的列表,你可以手动检查它们并创建特定于域的规则,你可以指出你想要使用的确切div。你可以通过一些人工干预非常有效率,并且在视觉上看到50个中的8个站点仍然是一个非常好的协议。
答案 1 :(得分:0)
我并没有找到一个很好的方法来决定哪个div是主要内容&#34;但是,我发现PhantomJS允许您渲染您在服务器端抓取的页面,并且能够使用Javascript和jQuery来获取您正在抓取的页面上元素的大小和位置。
所以通过使用PhantomJS你绝对可以得到哪个div是&#34;最大&#34;,div在顶部或底部或中心,这已经很长一段时间已经解决了找出哪个div的问题一个页面是&#34;主要内容&#34;。