Heim >Java >javaLernprogramm >Warum erhält mein Java-Programm beim Scraping von Google-Suchergebnissen den Fehler 403 Forbidden, während mein Browser dies nicht tut?

Warum erhält mein Java-Programm beim Scraping von Google-Suchergebnissen den Fehler 403 Forbidden, während mein Browser dies nicht tut?

DDD
DDDOriginal
2024-12-11 19:33:11405Durchsuche

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

Java-Programm empfängt 403 Forbidden Error, während Webbrowser erfolgreich sind

Problem:

Ein Java Ein Programm zum Abrufen der Ergebnisanzahl für eine bestimmte Google-Suchanfrage gibt bei derselben Abfrage den Fehler 403 Forbidden zurück liefert Ergebnisse in Webbrowsern. Codeausschnitt:

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

}

Fehler:

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)

Lösung:

Das Problem tritt aufgrund der URLConnection-Klasse von Java auf täuscht standardmäßig keinen tatsächlichen Benutzeragenten vor. Durch Ändern des Codes zum Festlegen eines User-Agent-Headers wird dieses Problem behoben:

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")));

Außerdem ist die SSL-Verarbeitung transparent, wie durch den Ausnahme-Stacktrace angezeigt.

Weitere Überlegungen:

Das Abrufen der Ergebniszahlen erfordert weitere Schritte, einschließlich der Fälschung eines Browsers durch das Abrufen von Cookies und das Parsen der Weiterleitung Token-Links:

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>

Die Ausführung dieses vollständigen Codes ergibt ein Ergebnis von 2930000000L.

Das obige ist der detaillierte Inhalt vonWarum erhält mein Java-Programm beim Scraping von Google-Suchergebnissen den Fehler 403 Forbidden, während mein Browser dies nicht tut?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn