Maison > Java > javaDidacticiel > Pourquoi mon programme Java obtient-il une erreur 403 Forbidden lors de la récupération des résultats de recherche Google alors que mon navigateur ne le fait pas ?

Pourquoi mon programme Java obtient-il une erreur 403 Forbidden lors de la récupération des résultats de recherche Google alors que mon navigateur ne le fait pas ?

DDD
Libérer: 2024-12-11 19:33:11
original
454 Les gens l'ont consulté

Why Does My Java Program Get a 403 Forbidden Error When Scraping Google Search Results While My Browser Doesn't?

Programme Java recevant une erreur 403 interdite alors que les navigateurs Web réussissent

Problème :

Un Java programme conçu pour récupérer le nombre de résultats pour une requête de recherche Google donnée renvoie une erreur 403 Forbidden, tandis que le même la requête donne des résultats dans les navigateurs Web. Extrait de code :

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;
    }

}
Copier après la connexion

Erreur :

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)
Copier après la connexion

Solution :

Le problème se pose car la classe URLConnection de Java ne simule pas un véritable agent utilisateur par défaut. La modification du code pour définir un en-tête d'agent utilisateur résout ce problème :

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")));
Copier après la connexion

De plus, la gestion SSL est transparente, comme l'indique la trace de pile d'exception.

Autres considérations :

La récupération du nombre de résultats implique d'autres étapes, notamment la simulation d'un navigateur en récupérant des cookies et en analysant le jeton de redirection. liens :

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>
Copier après la connexion

L'exécution de ce code complet donne un résultat de 2930000000L.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal