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 ?
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; } }
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)
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")));
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>
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!