Java クローラー - HttpClient は jsoup 分析をクロールします

Java クローラー HttpClient は jsoup 分析をクロールします

httpclientDemo を使用してデータをクロールする

HttpClient はApache Jakarta Common のサブプロジェクトであり、HTTP プロトコルをサポートする効率的で最新の機能豊富なクライアント プログラミング ツールキットを提供するために使用でき、HTTP プロトコルの最新バージョンと推奨事項をサポートします

依存関係を導入する

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.8</version>
</dependency>

新しいパッケージを作成してテスト クラスを作成する

HttpClientTest

public class HttpClientTest {
    
    

    public static void main(String[] args) {
    
    
        //1.生成httpclient,相当于该打开一个浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        //2.创建get请求,相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet("https://taolitop.com/");
        try {
    
    
            //3.执行get请求,相当于在输入地址栏后敲回车键
            response = httpClient.execute(request);
            //4.判断响应状态为200,进行处理
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    
    
                //5.获取响应内容
                HttpEntity httpEntity = response.getEntity();
                String html = EntityUtils.toString(httpEntity, "utf-8");
                System.out.println(html);

            } else {
    
    
                //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                System.out.println("返回状态不是200");
                System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
            }
        } catch (ClientProtocolException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //6.关闭
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
        }
    }
}

上記のコードを実行すると、完全な html コードが得られます

画像-20220827175735789

上記のように、ここに簡単な例があります

この Web サイトにはクローラー対策の設定がないため、関連するリソースを設定なしで簡単に取得できます。

以下のサイトをクロールすると、

https://www.tuicool.com/
<!DOCTYPE html>
<html>
    <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <p>系统检测亲不是真人行为,因系统资源限制,我们只能拒绝你的请求。如果你有疑问,可以通过微博 http://weibo.com/tuicool2012/ 联系我们。</p>
    </body>
</html>

これは、ボットが特定されたことを意味します。

解決策:

  • マスカレード ブラウザ: マスカレード リクエスト ヘッダー

ブラウザになりすます、実際に、なりすましをしていた場合、短期間に何度もアクセスすると、ウェブサイトがIPをブロックします.このとき、IPアドレスを変更し、プロキシIPを使用する必要があります.

  • プロキシ IP

インターネットには、xici などの無料のプロキシ IP Web サイトがいくつかあります。

長い間存続し、検証されたばかりの IP を選択します。ここでは、「112.85.168.223:9999」を選択します。

  • クロールの速度を遅くし、次のクロールに移動する前に一定期間プログラムをスリープ状態にすることも、アンチクロールの簡単な方法です。
  • 一部の Web サイトは、ログイン後に対応するリソースのみを要求できます。このとき、シミュレートされたログインが必要です。
 HttpGet request = new HttpGet("https://www.tuicool.com/");
        //设置请求头,将爬虫伪装成浏览器
        request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
        HttpHost proxy = new HttpHost("112.85.168.223", 9999);
        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
        request.setConfig(config);

サンプルコード

public class HttpClientTest2 {
    
    

    public static void main(String[] args) {
    
    
        //1.生成httpclient,相当于该打开一个浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        //2.创建get请求,相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet("https://www.tuicool.com/");
        //这里的地址网站有反爬虫的设计,下面是对反爬虫的处理
        //方法一,最简单的是对请求头进行伪装,伪装成浏览器
//        request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
        //设置请求头,将爬虫伪装成浏览器
        request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
        //如果你伪装了之后,如果短时间内一直多次访问的话,网站会对你的ip进行封杀,这个时候就需要换个ip地址了,使用代理IP
        HttpHost proxy = new HttpHost("112.85.168.223", 9999);
        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
        request.setConfig(config);
        try {
    
    
            //3.执行get请求,相当于在输入地址栏后敲回车键
            response = httpClient.execute(request);
            //4.判断响应状态为200,进行处理
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    
    
                //5.获取响应内容
                HttpEntity httpEntity = response.getEntity();
                String html = EntityUtils.toString(httpEntity, "utf-8");
                System.out.println(html);
            } else {
    
    
                //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                System.out.println("返回状态不是200");
                System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
            }
        } catch (ClientProtocolException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //6.关闭
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
        }
    }
}

jsoup を使用して html を解析する

jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。DOM、CSS、および jQuery のような操作メソッドを介してデータを取得および操作できる、非常に省力化されたAPIを提供します。

詳細については、ブログを参照してください https://blog.csdn.net/weixin_44540681/article/details/116378094

依存関係のインポート

<dependency>
	<!-- jsoup HTML parser library @ htt p://jsoup.org/ -->
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.10.2</version>
</dependency>

例として https://taolitop.com/ をクロールすると、以前は html コードを取得していましたが、今は画像リソースのみを取得したいと考えています。

上記のコードを変更しましょう (jsoup を使用)

 Document doc = Jsoup.parse(html);
Elements links = doc.getElementsByTag("img");
for (Element link : links) {
    
    
    String linkHref = link.attr("src");
    linkHref = "https://taolitop.com" +linkHref;
    System.out.println(linkHref);
}
public class HttpClientTest {
    
    

    public static void main(String[] args) {
    
    
        //1.生成httpclient,相当于该打开一个浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        //2.创建get请求,相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet("https://taolitop.com/");
        try {
    
    
            //3.执行get请求,相当于在输入地址栏后敲回车键
            response = httpClient.execute(request);
            //4.判断响应状态为200,进行处理
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    
    
                //5.获取响应内容
                HttpEntity httpEntity = response.getEntity();
                String html = EntityUtils.toString(httpEntity, "utf-8");
//                System.out.println(html);
                Document doc = Jsoup.parse(html);
                Elements links = doc.getElementsByTag("img");
                for (Element link : links) {
    
    
                    String linkHref = link.attr("src");
                    linkHref = "https://taolitop.com" +linkHref;
                    System.out.println(linkHref);
                }

            } else {
    
    
                //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                System.out.println("返回状态不是200");
                System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
            }
        } catch (ClientProtocolException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //6.关闭
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
        }
    }
}

画像-20220827182600443

これですべての画像リソースが揃いました

画像-20220827182702277

おすすめ

転載: blog.csdn.net/m0_61820867/article/details/126561034