【问题标题】:Writing a simple web crawler that interacts with the browser (Java)编写一个与浏览器交互的简单网络爬虫(Java)
【发布时间】:2011-03-15 05:26:44
【问题描述】:

我需要创建一个自动化流程(最好使用 Java):

  1. 使用特定网址打开浏览器。
  2. 使用指定的用户名和密码登录。
  3. 点击页面上的链接之一。
  4. 刷新浏览器。
  5. 退出。

这基本上是为了收集一些统计数据进行分析。每次用户点击链接时,都会为该特定用户生成一堆数据并保存在数据库中。我需要做的是,使用大约 10 个假用户,每 5-15 分钟 ping 一次页面。

你能想出一个简单的方法吗?必须有一个替代无休止的登录-刷新-注销手动过程...

【问题讨论】:

  • “要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,描述问题以及迄今为止为解决该问题所做的工作。”检查:stackoverflow.com/help/on-topic
  • @VinayakKaniyarakkal 感谢您的意见。事实上,我问了一个离题的问题,我得到了一个完美的答案,让我能够解决我遇到的问题。我希望我在这样做时没有吸引太多垃圾邮件。你能推荐一个更适合这类问题的 Stack Overflow 替代方案吗?
  • @JurekKozyra softwarerecs.stackexchange.com

标签: java browser web-crawler bots interaction


【解决方案1】:

如果需要,请使用 HtmlUnit

  1. 快速
  2. 简单

基于java的网络交互/爬取。

例如:这里是一些简单的代码,显示了一堆输出和一个访问加载页面的所有 IMG 元素的示例。

public class HtmlUnitTest {
  public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage("http://www.google.com");
    System.out.println(page.getTitleText());

    for (HtmlElement node : page.getHtmlElementDescendants()) {
      if (node.getTagName().toUpperCase().equals("IMG")) {
        System.out.println("NAME: " + node.getTagName());
        System.out.println("WIDTH:" + node.getAttribute("width"));
        System.out.println("HEIGHT:" + node.getAttribute("height"));
        System.out.println("TEXT: " + node.asText());
        System.out.println("XMl: " + node.asXml());
      }
    }
  }
}

示例 #2 访问命名输入字段并输入数据/单击:

final HtmlPage page = webClient.getPage("http://www.google.com");

HtmlElement inputField = page.getElementByName("q");
inputField.type("Example input");

HtmlElement btnG = page.getElementByName("btnG");
Page secondPage = btnG.click();

if (secondPage instanceof HtmlPage) {
  System.out.println(page.getTitleText());
  System.out.println(((HtmlPage)secondPage).getTitleText());
}

注意:您可以在任何 Page 对象上使用 page.refresh()。

【讨论】:

  • 是的,Htmlunit 是编写 java 爬虫的最佳选择……除非用户想对一个网站进行负载测试,这里似乎就是这种情况。
  • 已编辑答案并添加了输入数据和单击按钮的示例。我还提供了有关如何刷新浏览器的详细信息。我相信这些指标正在被 Web 应用程序/服务器捕获,并且 j3ny 只是寻求以指定的频率提供模拟用户。 HtmlUnit 看起来很合适。
【解决方案2】:

它不是 Java,而是 Javascript。你可以这样做:

window.location = "<url>"
document.getElementById("username").value = "<email>";    
document.getElementById("password").value = "<password>";

document.getElementById("login_box_button").click();

...

使用这种结构,您可以轻松覆盖 1-3。为页面刷新添加一些 for 循环就完成了。

【讨论】:

    【解决方案3】:

    你可以使用Jakarta JMeter

    【讨论】:

      【解决方案4】:

      试试Selenium

      【讨论】:

      • 谢谢 ;) 它作为一个浏览器插件非常好用。另一方面,我正在努力让生成的代码在我的 Java 程序中工作(例如,我想在刷新页面之前等待 X 秒 - 在代码中比在浏览器插件中更容易做到)。设置 Selenium RC 可能会很痛苦...
      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多