+-
使用Java在网页中查找单词
我正在使用 Java和 Eclipse来搜索特定网页中的特定单词.问题是,如果我要访问的网页几乎没有内容,那么它可以正常工作,但是当我在“大型”网页中尝试时,找不到该单词.

例如:我正在尝试在网页:https://www.facebook.com中找到单词[“ InitialChatFriendsList”,如果找到单词,则打印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时,您首先需要登录到您的帐户,否则您将看到开始页面:

Starting page of Facebook

我想您认为从浏览器(例如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:

Cookies of Facebook

突出显示的c_user cookie与该会话肯定相关.如果删除它并刷新页面,则无法登录.

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

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

备注

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

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

TOS摘录:

Safety 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.
点击查看更多相关文章

转载注明原文:使用Java在网页中查找单词 - 乐贴网