使用 java 在网页中查找单词

Finding a word in a web page using java

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

例如:我试图在网页中找到单词 ["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-ressources 和新的 IO 库 NIO)它看起来完全没问题并且似乎没有逻辑错误。


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

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

中交谈

展示

作为一个小实验,使用您的 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:

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


解决方案

为了工作,您的 Java 代码需要通过填写表单并提交(或仅通过发送相应的 POST 请求)自行登录,然后收听Facebook 并保存所有这些 cookie 信息。然而,自己做这件事将是一项艰巨的任务,我不推荐这样做。相反,您可以使用从 Java 内部模拟浏览器的 API,例如 HTMLUnit. Alternatively you could use libraries like Selenium,您可以通过它的驱动程序界面直接控制您最喜欢的浏览器。

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


备注

现在,非常重要,请注意 Facebook(以及 Twitter 等其他网站)有 public 可用 APIFacebook for Developers) which is designed to ease the interaction with automated software. There are of course also Java API Wrapper available, like Facebook4J . 所以如果你想抓取像 Facebook 这样的网站,你应该只使用那些 APIs。

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

服务条款摘录:

  1. Safety
    1. You will not collect users' content or information, or otherwise access Facebook, using automated means (such as harvesting bots, robots, spiders, or scrapers) without our prior permission.

您可以尝试使用 Jsoup

此库允许您连接并加载页面以对其进行解析。

这是一个example