【发布时间】: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