当前位置: 首页 > 面试题库 >

403禁止使用Java,但不能使用网络浏览器?

胥康安
2023-03-14
问题内容

这通常是由XML声明前的空白引起的,但是它可以是任何文本,例如破折号或任何字符。我说这通常是由空白引起的,因为人们认为空白始终是可忽略的,但事实并非如此。

经常发生的另一件事是UTF-8 BOM(字节顺序标记),如果将文档作为字符流传递给XML解析器而不是字节流,则在将XML声明视为空白之前允许我正在编写一个小型Java程序,以获取给定Google搜索字词的结果数量。出于某种原因,在Java中我得到了403禁止访问,但在Web浏览器中却得到了正确的结果。码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;


public class DataGetter {

    public static void main(String[] args) throws IOException {
        getResultAmount("test");
    }

    private static int getResultAmount(String query) throws IOException {
        BufferedReader r = new BufferedReader(new InputStreamReader(new URL("https://www.google.com/search?q=" + query).openConnection()
                .getInputStream()));
        String line;
        String src = "";
        while ((line = r.readLine()) != null) {
            src += line;
        }
        System.out.println(src);
        return 1;
    }

}

错误:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.google.com/search?q=test
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at DataGetter.getResultAmount(DataGetter.java:15)
    at DataGetter.main(DataGetter.java:10)

为什么这样做呢?使用UTF-8 BOM。

如果使用架构文件(.xsd)验证xml文件,并且其中一个架构文件具有UTF-8 BOM,则可能会发生同样的情况。


问题答案:

你只需要设置用户代理标头即可使其工作:

URLConnection connection = new URL("https://www.google.com/search?q=" + query).openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
connection.connect();

BufferedReader r  = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));

StringBuilder sb = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
    sb.append(line);
}
System.out.println(sb.toString());

从异常堆栈跟踪可以看出,已为你透明地处理了SSL。

但是,获取结果数量并不是真的那么简单,在此之后,你必须通过获取Cookie并解析重定向令牌链接来假冒你是浏览器。

String cookie = connection.getHeaderField( "Set-Cookie").split(";")[0];
Pattern pattern = Pattern.compile("content=\\\"0;url=(.*?)\\\"");
Matcher m = pattern.matcher(response);
if( m.find() ) {
    String url = m.group(1);
    connection = new URL(url).openConnection();
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
    connection.setRequestProperty("Cookie", cookie );
    connection.connect();
    r  = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));
    sb = new StringBuilder();
    while ((line = r.readLine()) != null) {
        sb.append(line);
    }
    response = sb.toString();
    pattern = Pattern.compile("<div id=\"resultStats\">About ([0-9,]+) results</div>");
    m = pattern.matcher(response);
    if( m.find() ) {
        long amount = Long.parseLong(m.group(1).replaceAll(",", ""));
        return amount;
    }

}

运行我得到的完整代码2930000000L。



 类似资料:
  • 我正在编写一个小Java程序,以获取给定谷歌搜索词的结果量。出于某种原因,在Java中我得到了403,但我在web浏览器中得到了正确的结果。代码: 和错误: 它为什么这样做?

  • 问题内容: 我最近尝试使用Apache设置测试服务器。该站点必须在domain下运行。我总是会出错。我使用的是Ubuntu 10.10服务器版本。doc根目录在dir下。以下是我的设置: / var / www的内容 服务器上主机文件的内容(IP 192.168.2.5) 网站配置 我的文档根目录中没有文件。权限设置正确(可通过www-data读取)。 如果我从桌面输入IP地址,则该站点将正确显示

  • 问题内容: 如何防止使用JavaScript浏览网页? 问题答案: 使用可以显示消息,但不会中断导航(因为为时已晚)。但是,使用会中断导航: 注意:返回空字符串,因为较新的浏览器提供了诸如“任何未保存的更改将丢失的信息”之类的消息,这些消息不能被覆盖。 在较旧的浏览器中,您可以指定要在提示中显示的消息:

  • 本文向大家介绍如何禁止浏览器使用后退按钮功能,包括了如何禁止浏览器使用后退按钮功能的使用技巧和注意事项,需要的朋友参考一下 本文介绍可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。 一、概述    曾经有许多人问起,“怎样才能‘禁用'浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”在ASP论坛上,这个问题也是问得最多的问题之一。遗憾的是,答案非常

  • 问题内容: 我想在代码内部使用以下命令,因为每次执行代码时,都会创建一个新的浏览器实例,默认情况下将通过该实例启用安全性。 问题答案: 尝试以下操作,更改路径并以符合您要求的方式大幅降低编码:- 以下是列出所有可用的chrome标志的链接:- http://peter.sh/experiments/chromium-command-line- switches/ 希望它能对您有所帮助:)

  • 问题内容: 我正在一个需要在线进行字体试用的网站上,我拥有的字体都是.otf 有没有一种方法可以嵌入字体并使它们在所有浏览器上都能正常工作? 如果没有,我还有什么其他选择? 问题答案: 您可以使用@ font-face 来实现字体,例如: 但是,如果您想支持各种现代浏览器,我建议您切换到WOFF和TTF字体类型。WOFF每种主流桌面浏览器都可以实现该TTF类型,而旧版Safari,Android和