【问题标题】:HTML Snapshot for crawler - Understanding how it works爬虫的 HTML 快照 - 了解它的工作原理
【发布时间】:2010-10-08 11:36:45
【问题描述】:

我今天正在阅读article。老实说,我对“2。您的大部分内容是由 PHP 或 ASP.NET 等服务器端技术创建的”这一点非常感兴趣。

如果我理解了,我想理解:)

我创建了该 php 脚本 (gethtmlsnapshot.php),其中包含服务器端 ajax 页面 (getdata.php) 并转义(出于安全考虑)参数。然后我将它添加到 html 静态页面 (index-movies.html) 的末尾。对?现在...

1 - 我把 gethtmlsnapshot.php 放在哪里?换句话说,我需要调用(或者更好的是,爬虫需要)该页面。但是如果我在主页上没有链接,爬虫就不能调用它:O 爬虫如何调用带有_escaped_fragment_参数的页面?如果我不在某个地方具体说明它们,它就不会知道它们:)

2 - 船员如何使用参数调用该页面?和以前一样,我需要使用参数链接到该脚本,因此,crewler 浏览每个页面并保存动态结果的内容。

你能帮帮我吗?您如何看待这种技术?如果爬虫的开发者以其他方式做自己的机器人会不会更好? :)

让我知道你的想法。干杯

【问题讨论】:

    标签: html web-crawler


    【解决方案1】:

    我认为您有问题,所以我将尝试解释这里发生的事情,包括背景和替代方案。因为这确实是我们大多数人不时偶然发现(或至少类似的东西)的一个非常重要的话题。

    使用 AJAX 或更确切地说是异步增量页面更新(因为大多数页面实际上不使用 XML 而是 JSON),丰富了 Web 并提供了出色的用户体验。

    然而,它也是有代价的。

    主要问题是根本不支持 xmlhttpget 对象或 JavaScript 的客户端。 一开始,您必须提供向后兼容性。 这通常通过提供链接并捕获 onclick 事件并触发 AJAX 调用来完成,而不是重新加载页面(如果客户端支持它)。

    今天几乎每个客户端都支持必要的功能。

    所以今天的问题是搜索引擎。因为他们没有。好吧,这并不完全正确,因为他们部分这样做(尤其是谷歌),但出于其他目的。 谷歌评估某些 JavaScript 代码以防止 Blackhat SEO(例如,指向某处的链接,但 JavaScript 打开了一些完全不同的网页......或客户端不可见的 html 关键字代码,因为它们被 JavaScript 或相反的方式删除)。

    但要保持简单,最好考虑一个非常基本的浏览器的搜索引擎爬虫,不支持 CSS 或 JS(CSS 也是如此,它的一方因特殊原因而被解析)。

    因此,如果您的网站上有“AJAX 链接”,而 Webcrawler 不支持使用 JavaScript 跟踪它们,它们就不会被抓取。还是他们? 答案是 JavaScript 链接(比如 document.location 什么的)被跟踪。谷歌通常足够聪明,可以猜出目标。 但是没有进行ajax调用。很简单,因为它们返回部分内容,并且无法从中构造出有意义的整个页面,因为上下文是未知的,并且唯一的 URI 不代表内容的位置。

    所以基本上有 3 种策略可以解决这个问题。

    1. 在链接上使用正常的 href 属性作为后备的 onclick 事件(imo 是最佳选择,因为它解决了客户和搜索引擎的问题)
    2. 通过您的站点地图提交内容网站,以便它们被编入索引,但与您的站点链接完全不同(通常页面会提供指向此 url 的永久链接,以便外部页面链接它们以获得 pagerank)
    3. ajax 爬取方案

    这个想法是让您的 JavaScript xmlhttpget 请求与相应的 href 属性纠缠在一起,如下所示: www.example.com/ajax.php#!key=value

    所以链接看起来像:

    <a href="http://www.example.com/ajax.php#!page=imprint" onclick="handleajax()">go to my imprint</a>
    

    函数handleajax 可以评估document.location 变量以触发增量异步页面更新。它也可以传递一个 id 或 url 或其他任何东西。

    然而,爬虫识别 ajax 爬取方案格式并自动获取 http://www.example.com/ajax.php.php?%23!page=imprint 而不是 http://www.example.com/ajax.php#!page=imprint 因此,您的查询字符串然后包含 html 片段,您可以从中判断哪些部分内容已被更新。 因此,您只需确保 http://www.example.com/ajax.php.php?%23!page=imprint 返回一个完整的网站,该网站在 xmlhttpget 更新完成后看起来就像用户应该看到的那样。

    一个非常优雅的解决方案是将 a 对象本身传递给处理函数,然后该处理函数获取与爬虫使用 ajax 获取的相同 URL,但带有附加参数。然后,您的服务器端脚本将决定是交付整个页面还是仅交付部分内容。

    这确实是一种非常有创意的方法,下面是我个人的公关分析:

    专业人士:

    • 部分更新的页面会收到一个唯一标识符,此时它们是语义网络中的完全合格资源
    • 部分更新的网站会收到一个可由搜索引擎提供的唯一标识符

    缺点:

    • 它只是搜索引擎的后备解决方案,不适用于没有 JavaScript 的客户端
    • 它为黑帽 SEO 提供了机会。因此,如果没有对内容进行适当的验证,Google 肯定不会完全采用该技术或将使用该技术的网页排名靠前。

    结论:

    • 只是带有后备遗留工作 href 属性的常用链接,但 onclick 处理程序是更好的方法,因为它们为旧浏览器提供功能。

    • ajax 抓取方案的主要优点是部分更新的网站获得唯一的 URI,您不必创建以某种方式作为可索引和可​​链接对应物的重复内容。

    • 您可能会争辩说,ajax 抓取方案的实现更加一致且更易于实现。我认为这是您的应用程序设计的问题。

    【讨论】:

    • 哦!现在很清楚它是如何工作的! :) 非常感谢人!我不明白爬虫是如何从页面中获取链接的。现在我明白了,我把它们放在href链接上。是的,它应该工作!这是一个伟大的“escamotage”!但我认为这是一个很好的技巧,而不是 web 2.0 的 SEO 的真正解决方案。 :) 但是好的,它似乎有效!只有最后一件事:这只有在浏览器在 href 之前评估 onclick 事件时才有效(但我认为所有人都这样做)。谢谢乔,你真的帮了我:)
    • 对不起我的废话英语:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2016-02-20
    • 2012-12-11
    • 2011-02-18
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多