【问题标题】:Creating a bot/crawler创建机器人/爬虫
【发布时间】:2013-01-02 22:57:25
【问题描述】:

我想制作一个小机器人,以便自动和牙周浏览一些合作伙伴的网站。这将为这里的许多员工节省几个小时。

机器人必须能够:

  • 连接到该网站,其中一些以用户身份登录,访问和解析网站上的特定信息。
  • 机器人必须集成到我们的网站并使用我们网站的数据更改其设置(使用的用户...)。最终它必须总结解析信息。
  • 最好此操作必须从客户端完成,而不是在服务器上。

我上个月试过飞镖,很喜欢…… 我想用飞镖来做。

但我有点失落: 我可以为每个要解析的网站使用 Document 类对象吗? 可能是无头的,或者我应该使用 chrome/dartium api 来控制网络浏览器(我想避免这种情况)?

我一直在阅读此主题:https://groups.google.com/a/dartlang.org/forum/?fromgroups=#!searchin/misc/crawler/misc/TkUYKZXjoEg/Lj5uoH3vPgIJ 使用https://github.com/dart-lang/html5lib 对我来说是个好主意吗?

【问题讨论】:

  • 它不在飞镖中,但蜘蛛似乎很有趣:github.com/mikeal/spider
  • 嗨,Jhon_,看来您对答案很满意。你介意批准吗?

标签: web-crawler dart


【解决方案1】:

这有两个部分。

  1. 从远程站点获取页面。
  2. 将页面读入一个可以解析的类。

对于第一部分,如果您计划运行此客户端,您可能会遇到跨站点问题,因为您的页面从服务器 X 提供,无法从服务器 Y 请求页面,除非正确标题已设置。

见:CORS with Dart, how do I get it to work?Dart application and cross domain policy 或者有问题的网站需要返回正确的CORS headers

假设您实际上可以从远程站点客户端获取页面,您可以使用 HttpRequest 来检索实际内容:

// snippet of code...
new HttpRequest.get("http://www.example.com", (req) {
  // process the req.responseText
});

您也可以使用HttpRequest.getWithCredentials。如果该站点有一些自定义登录,那么您可能会遇到问题(因为您可能不得不将您站点的用户名和密码 Http POST 到他们的服务器 -

这是第二部分的时候。您可以使用DocumentFragment.html(...) 构造函数处理您的HTML,它为您提供了一个可以迭代和递归的节点集合。下面的示例显示了一个静态 html 块,但您可以使用从上面的 HttpRequest 返回的数据。

import 'dart:html';

void main() {
  var d = new DocumentFragment.html("""
    <html>
      <head></head>
      <body>Foo</body>
    </html>
  """);

  // print the content of the top level nods
  d.nodes.forEach((node) => print(node.text)); // prints "Foo"
  // real-world - use recursion to go down the hierarchy.

}

我猜(之前没有写过蜘蛛)你会想要在特定位置/深度提取特定标签来总结为你的结果,并在 超链接中添加 url 到队列中您的机器人将导航到。

【讨论】:

  • 感谢您提供如此详尽的回答。
  • 是的,我很可能需要进行 http POST。所以这是一个不容易解决的问题? (由于 CORS?)您谈到了节点上的迭代。但是可以使用飞镖查询吗?就像在这个 DocumentFragment 中一样 api.dartlang.org/docs/bleeding_edge/dart_html/…
  • 我在问这些问题,但我不确定我是否完全理解 CORS 的限制。此链接:developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 来自您的第二个链接。似乎真的很清楚。我还在读书。
  • 基本上,如果您从 foo.com 提供的网站向 bar.com 请求页面或其他数据,则 bar.com 必须提供明确允许 foo.com 请求数据的标头,或者提供允许任何站点请求数据的标头(例如:Access-Control-Allow-Origin: *)。另一个解决方法可能是JSONP - 尽管您没有请求 JSON,但同样的方法可能仍然有效。注意 - 这些不是 Dart 中的限制,而是浏览器安全模型中的限制。
猜你喜欢
  • 2015-11-16
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2014-03-30
相关资源
最近更新 更多