【问题标题】:Finding a word in a web page using java使用java在网页中查找单词
【发布时间】:2018-02-04 21:56:01
【问题描述】:

我正在尝试在特定网页中搜索特定单词,我使用的是 Java 和 Eclipse。问题是,如果我正在使用几乎没有内容的网页,它可以正常工作,但是当我在“大”网页中尝试时,它找不到这个词。

例如:我正在尝试在网页中查找单词["InitialChatFriendsList"https://www.facebook.com,如果找到该单词则打印WIN!!!

这是完整的 Java 代码:

public class BR4Qustion {               
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            URL url = new URL("https://www.facebook.com");  
            br = new BufferedReader(new InputStreamReader(url.openStream()));

            String foundWord = "[\"InitialChatFriendsList\"";          
            String sCurrentLine;

            while ((sCurrentLine = br.readLine()) != null) {
                String[] words = sCurrentLine.split(",");
                for (String word : words) {         
                    if (word.equals(foundWord)) {
                        System.out.println("WIN!!!");
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (IOException ex) {
                System.out.println("*** IOException for URL : ");
            }
        }
    }
}

【问题讨论】:

  • 你为什么用,分割单词?为什么你认为带有方括号和两个双引号的字符串无论如何都是一个“单词”?
  • 大网页”是什么意思?请注意,例如,当使用此代码并访问 facebook 时,您未登录并正在阅读起始页!出于调试目的,您可以只打印页面的全部内容并检查这是否是您期望的内容。因为代码本身乍一看并没有错。
  • 通过浏览器登录是不够的。这就是我想告诉你的。有关登录状态的信息保存在 cookie(特定于浏览器)中,Java url.openStream()不会访问您特定浏览器的这些 cookie 信息。我很确定对于您的 Java 代码,您正在阅读 facebook 的起始页,因此该代码不起作用。只需检查您的BufferedReader 阅读的内容,它可能是起始页。您需要通过您的 Java 应用程序登录或劫持会话,因为这两种 API 都存在。
  • 当您说“查看源代码”时,您的意思是从您登录的浏览器内部?是的,但“Javas 浏览器”没有登录到您的 Facebook 帐户。要说服自己这个问题,请尝试使用第二个浏览器并访问 facebook。例如,使用 Google Chrome 登录,然后使用 Internet Explorer 访问 facebook。对于 IE,您没有登录。登录信息保存在浏览器本地数据 (cookies) 中,不会在浏览器之间共享。 Java 不会访问这些数据,您需要通过 Java 本身登录或劫持会话。
  • @Nehoral:您为什么要尝试抓取 Facebook 页面而不是仅使用 Facebook API?绕过 API 的限制通常是违反 TOS 的,“大”网站有各种机制来检测自动“用户”(我们通常认为他们是“攻击者”)并向他们提供不同的内容。

标签: java web-scraping bufferedreader


【解决方案1】:

问题

除了你的代码有一些小缺陷(你应该使用 try-with-ressources 和新的 IO 库 NIO)它看起来完全没问题 而且似乎没有逻辑错误。


您在这里面临不同的问题。尝试阅读 Facebook 时,您首先需要登录您的帐户,否则您将看到起始页

我猜您认为从浏览器(例如 Google Chrome)登录就足够了,但事实并非如此。登录信息保存在您使用的特定浏览器的本地存储中,例如在其 cookies 中。我们在会话中交谈。


展示

作为一个小实验,使用 Google Chrome 访问 Facebook 并登录。之后用 Internet Explorer 访问它,它将不会登录,而您正在再次阅读起始页。

Java 代码也是如此,您只是在阅读起始页,因为对于“Javas browser”,您还没有登录。您可以通过转储 BufferedReader 正在阅读的内容来检查它:

final URL url = new URL("https://www.facebook.com");
try (final BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
    // Read the whole page
    while (true) {
        final String line = br.readLine();
        if (line == null) {
            break;
        }

        System.out.println(line);
    }
}

看看输出,它可能是起始页面的来源。


见解

通过我的浏览器登录 Facebook 后,网站会向我发送以下 cookie:

突出显示的c_user cookie 肯定与会话相关。如果我删除它并刷新页面,那么我将不再登录。


解决方案

为了工作,您的 Java 代码需要登录自己,通过填写表单并提交(或发送相应的 POST 请求),然后听取 Facebook 的回答并保存所有这些 cookie 信息。但是,自己做这将是一项艰巨的任务,我不建议这样做。相反,您可以使用从 Java 内部模拟浏览器的 API,例如 HTMLUnit。或者,您可以使用 Selenium 之类的库,您可以通过其驱动程序界面直接控制您喜欢的浏览器。

另一种方法是劫持会话。在那里,您尝试从浏览器本地文件中提取相关的 cookie 数据,并在 Java 应用程序中重新创建具有相同内容的 cookie 数据。对于非专家来说,这也是一项没有 API 的艰巨任务。


备注

现在,非常重要的是,请注意 Facebook(以及 Twitter 等其他网站)有一个公共可用 API (Facebook for Developers),旨在简化与自动化软件的交互。当然也有可用的 Java API Wrapper,比如Facebook4J。因此,如果您尝试抓取 Facebook 等网站,您应该只使用这些 API。

另请注意,包括 Facebook 在内的许多网站都在其服务条款 (TOS) 中声明,通过不使用其 API 的自动化软件进行的交互被视为违反这些条款。这可能会导致法律后果

TOS 的摘录:

  1. 安全
    1. 您不会收集用户的内容或信息,或以其他方式访问 Facebook,使用自动方式(例如收割机器人、机器人、蜘蛛或 scrapers )未经我们事先许可。

【讨论】:

    【解决方案2】:

    您可以尝试使用Jsoup

    这个库允许你连接和加载一个页面来解析它。

    这是example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2018-03-28
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多