我正在尝试在特定网页中搜索特定单词,我正在使用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 : ");
            }
        }
    }
}

最佳答案

问题

除了代码中的一些小缺陷(您应该使用 try-with-resources 和新的IO库 NIO )外,它看起来完全不错,并且似乎没有逻辑错误。

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

java - 使用Java在网页中查找单词-LMLPHP

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

展示柜

作为一个小实验,请使用您的Google Chrome浏览器访问Facebook并登录。用Internet Explorer访问它之后,它将不再登录到中,并且您正在重新阅读起始页。

您的Java代码也会发生同样的情况,您只是在阅读起始页,因为对于“Javas浏览器”,您尚未登录。您可以通过转储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:

java - 使用Java在网页中查找单词-LMLPHP

突出显示的c_user cookie与该会话绝对相关。如果我删除它并刷新页面,则无法再登录。



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

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

备注

现在,非常重要的是,请注意,Facebook(以及其他类似Twitter的网站)具有公共可用API (Facebook for Developers),旨在简化与自动化软件的交互。当然也有Java API包装器,如Facebook4J。因此,如果尝试抓取Facebook之类的网站,则应仅使用这些API。

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

TOS摘录:


  • 安全


  • 未经我们事先许可,您不会使用自动方式(例如,收获机器人,机器人,蜘蛛或刮板)来收集用户的内容或信息,或者否则将访问Facebook
  • 09-10 05:59
    查看更多