我正在尝试在特定网页中搜索特定单词,我正在使用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时,您首先需要登录到您的帐户,否则您将看到起始页:
我想您认为从浏览器(例如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:
突出显示的
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摘录: