【问题标题】:Scraping data from webpage using Java?使用Java从网页中抓取数据?
【发布时间】:2013-02-16 19:51:51
【问题描述】:

我正在为我的一个班级创建一个 twitter 机器人来练习使用队列并构建我的简历。

我希望机器人从 paper.li 时事通讯中抓取 Twitter 句柄,然后向用户发送推文。

这是一个示例网页。 http://paper.li/profkane/1335985326

我的推理,最初是抓取网页的链接,然后获取页面源,浏览它找到@twitterhandle,然后将它们添加到队列中,以供以后构建消息时使用。

我查找了页面源代码,但在网页上的任何地方都找不到 Twitter 名称。这在Java中仍然可以做到吗?

【问题讨论】:

  • 您是否正在将 Java 与 Javascript 混合使用?
  • 除非必须,否则我不打算这样做。我希望我可以在 Java 中完成所有这些工作。我不精通javascript
  • 你能更好地描述一下你的意图是什么吗?我没有以某种方式获得“推特句柄”部分。 。我在你给出的示例链接上得到的关于 twitter 的唯一信息是小部件,它使用 javascript 更新自己的推文
  • 是的,paper.li 使用 javascript 来显示推文。我的机器人会为推特用户名的“@name”报废 paper.li,然后将推文发回给他们。在这种特殊情况下,我想回复他们在上面列出的 paper.li 网站首页上列出了多少次。

标签: java twitter web-scraping bots headless-browser


【解决方案1】:

您需要使用支持 javascript 的库。我为此使用 HtmlUnit,这是一个用于复制浏览器行为的出色库!

请参阅下面我修改后的答案from this question,以获取有关如何使用 javascript 访问页面的简单示例。

首先,查看他们的网页 (http://htmlunit.sourceforge.net/) 以启动和运行 htmlunit。确保你使用最新的快照(写这篇文章时是 2.12)

尝试这些设置几乎可以忽略任何障碍:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);

然后在获取您的页面时,请确保在对页面执行任何操作之前等待后台 Javascript,例如等待后台 javascript。

//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");

//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);

//Get full page _after_ javascript has rendered it fully
System.out.println(page1.asXml());    

希望这个基本示例对您有所帮助!

您可以使用 HtmlUnit 执行浏览器可以执行的几乎所有操作,但以编程方式。

【讨论】:

  • 谢谢这是有趣的东西。我刚刚意识到还有另一层复杂性。我上面链接的页面不包括 Twitter 句柄名称。我必须单独单击每个链接,然后使用包含 twitter 句柄 (@name) 的 javascript 显示一个小框。 htmlPage 会处理这个。我想我每次点击链接时都必须打印整个页面。
  • 实际上我刚刚检查了示例网页,链接显示了 twitter 名称,而不是 twitter 句柄 (@name),它链接到我从中获取的 xml 文件中的 www.twitter.com/@name htmlUnit 是否会包含 Twitter 名称
  • 你可以用 htmlunit 做到这一点。如果链接是已加载数据的隐藏 div,它应该在源代码中可见,无需获取 htmlunit 来单击它们。如果您想与页面互动,请在我的答案开头的链接问题中查看我的原始答案!
  • 如果它对您有帮助,即使您的代表数较低,您也可以将其标记为答案,但在我看来您有 19 个代表:)
  • 你可以在他们的构建服务器上找到,这里:build.canoo.com/htmlunit/artifacts 首先在这个简单的页面上尝试你的代码:simile.mit.edu/crowbar/test.html 如果 javascript 执行有效,内容会说“Hi Crowbar”。如果 javascript 不起作用,它会显示“Hello lame ...”
【解决方案2】:

就抓取而言,您可以抓取整个页面并查找 twitter id(或句柄)。当我检查示例页面时,我找不到这样的句柄,但在 Twitter 图标中有指向用户帐户的链接。您可以使用它来获取句柄。如果你正在寻找 Java 中的抓取库,你可以试试 JSOUP。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2014-11-10
    相关资源
    最近更新 更多