> Java > java지도 시간 > 내 브라우저에서는 Google 검색 결과를 스크랩할 때 내 Java 프로그램에 403 금지 오류가 발생하는 이유는 무엇입니까?

내 브라우저에서는 Google 검색 결과를 스크랩할 때 내 Java 프로그램에 403 금지 오류가 발생하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-11 19:33:11
원래의
400명이 탐색했습니다.

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

웹 브라우저가 성공하는 동안 Java 프로그램에서 403 금지 오류 수신

문제:

Java 주어진 Google 검색어에 대한 결과 수를 검색하도록 설계된 프로그램은 403 Forbidden 오류가 발생하지만 동일한 쿼리는 웹 브라우저에서 결과를 생성합니다. 코드 조각:

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)
로그인 후 복사

해결 방법:

이 문제는 Java의 URLConnection 클래스 때문에 발생합니다. 기본적으로 실제 사용자 에이전트를 위조하지 않습니다. 사용자 에이전트 헤더를 설정하도록 코드를 수정하면 이 문제가 해결됩니다.

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")));
로그인 후 복사

또한 SSL 처리는 예외 스택 추적에 표시된 대로 투명합니다.

추가 고려 사항:

결과 개수를 검색하려면 쿠키를 가져와 브라우저를 속이는 등의 추가 단계가 필요합니다. 리디렉션 토큰 링크 구문 분석:

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>
로그인 후 복사

이 전체 코드를 실행하면 2930000000L의 결과가 나옵니다.

위 내용은 내 브라우저에서는 Google 검색 결과를 스크랩할 때 내 Java 프로그램에 403 금지 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿