Javaネットワーク爬虫実操(5)

6023 ワード

下一篇:Java网络爬虫实操
皆さん、こんにちは、前の文章で紹介したURLはすべてHTMLの内容を返して、それからHTML文字列の中から私たちが望んでいるデータを解析します.しかし、フロントエンドのプログラミング技術の発展に伴い、少なくとも10年以上前からajax、jsonなどの技術が主流となっている.Webページで見た多くのデータはajaxがサーバを非同期で要求し、jsonデータ形式で応答結果を返してWebページにロードしたものです.
この記事の目的は、NetDiscovery爬虫類フレームワークを使用し、GETとPOSTの2つの方法で、私たちが望んでいるjsonデータを取得することです.
1)都市名の取得
  • 選択都市のドロップダウンボックスには各省の主流都市名:
  • がある.
  • ブラウザを開き、このデータソースを提供するリンクを見つけます:
  • NetDiscoveryに基づいて、コードの書き込みを開始します(コードは、データの取得方法を示すためだけです)
  • .
    Mainクラス
    package com.cv4j.netdiscovery.example;
    
    import com.cv4j.netdiscovery.core.Spider;
    import com.cv4j.netdiscovery.core.domain.HttpMethod;
    import com.cv4j.netdiscovery.core.domain.Request;
    
    public class TestSpider {
        public static void main(String[] args) {
            String url = "https://www.zhipin.com/common/data/city.json";
            Request request = new Request(url)
                    .httpMethod(HttpMethod.GET);  //GET       ,    
    
            Spider.create()
                    .name("getcitys")
                    .request(request)
                    .parser(new TestParser())
                    .run();
        }
    }
    

    Parserクラス
    package com.cv4j.netdiscovery.example;
    
    import com.cv4j.netdiscovery.core.config.Constant;
    import com.cv4j.netdiscovery.core.domain.Page;
    import com.cv4j.netdiscovery.core.parser.Parser;
    
    public class TestParser implements Parser {
        @Override
        public void process(Page page) {
            try {
                String response = page.getField(Constant.RESPONSE_JSON).toString();
                System.out.println("response = "+response);
            } catch(Exception e) {
            }
        }
    }
    
    
  • プログラム実行結果
  • 2)採用ポストの獲得
  • 同様の方法で、まずブラウザの人肉でターゲットオブジェクトを分析します:
  • 伝達するパラメータ
  • をもう一度見てください.
    GETとPOSTの伝達パラメータの違いをはっきり区別するには、
    POSTパラメータのタイプには、アプリケーション/json、アプリケーション/x-www-form-urlencodeなどの概念が必要です.
  • コードMainクラス
  • の書き込みを開始
    package com.cv4j.netdiscovery.example;
    
    import com.cv4j.netdiscovery.core.Spider;
    import com.cv4j.netdiscovery.core.config.Constant;
    import com.cv4j.netdiscovery.core.domain.HttpMethod;
    import com.cv4j.netdiscovery.core.domain.HttpRequestBody;
    import com.cv4j.netdiscovery.core.domain.Request;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class TestSpider {
        public static void main(String[] args) {
            String url = "https://www.lagou.com/jobs/positionAjax.json?city=%E8%8B%8F%E5%B7%9E&needAddtionalResult=false&isSchoolJob=0";
    
            Map postParams = new HashMap<>();
            postParams.put("first",true);
            postParams.put("pn",1);
            postParams.put("kd","     ");
    
            Request request = new Request(url)
                    .httpMethod(HttpMethod.POST)
                    .httpRequestBody(HttpRequestBody.form(postParams, Constant.UTF_8));
    
            Spider.create()
                    .name("getpositions")
                    .request(request)
                    .parser(new TestParser())
                    .run();
        }
    }
    

    Parserクラス同上TestParser
    しかし、結果は次のとおりです.
    どうして?提示された文字に惑わされないでください.初めてアクセスしたのに、頻繁な操作によるものではありません.この結果を返すのは、ウェブサイトのサービス側が設計した反爬虫手段である.Webサービス側は、ブラウザでアクセスしている人ではないことを認識しているので、この結果を返します.したがって,プログラムはブラウザの操作をできるだけリアルにシミュレートし,ウェブサイトのサービス側がブラウザがアクセスしていると見なすようにしなければならない.
    できるだけリアルにシミュレーションするにはどうすればいいですか?プログラムでrequestのデータをできるだけプログラムに入れる
    経験上、一般的にReferとUser-Agentを設定します(httpプロトコル参照)
    新しいMainクラス
    package com.cv4j.netdiscovery.example;
    
    import com.cv4j.netdiscovery.core.Spider;
    import com.cv4j.netdiscovery.core.config.Constant;
    import com.cv4j.netdiscovery.core.domain.HttpMethod;
    import com.cv4j.netdiscovery.core.domain.HttpRequestBody;
    import com.cv4j.netdiscovery.core.domain.Request;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class TestSpider {
        public static void main(String[] args) {
            String url = "https://www.lagou.com/jobs/positionAjax.json?city=%E8%8B%8F%E5%B7%9E&needAddtionalResult=false&isSchoolJob=0";
    
            Map postParams = new HashMap<>();
            postParams.put("first",true);
            postParams.put("pn",1);
            postParams.put("kd","     ");
    
            Request request = new Request(url)
                    .httpMethod(HttpMethod.POST)
                    .referer("https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=sug&fromSearch=true&suginput=%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B")
                    .ua("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")
                    .httpRequestBody(HttpRequestBody.form(postParams, Constant.UTF_8));
    
            Spider.create()
                    .name("getpositions")
                    .request(request)
                    .parser(new TestParser())
                    .run();
        }
    }
    

    サービス側はついにデータの結果を返しました(データが役に立つかどうかは、さらに分析する必要があります):
    3)まとめ
    本文の知識点はajax非同期実行の概念を把握し、jsonデータフォーマットを理解し、グーグルブラウザのDeveloper Toolsなどのデバッグツールの使用を学ぶことなどを含む.
    最も重要なのはhttpプロトコルを理解することです.
    自分で操作したい方は、githubのNetDiscoveryにアクセスしてください.
    本明細書では、プログラミング技術の交流にのみ使用され、他人の本番サーバに頻繁にアクセスすることは推奨されません.
    上一篇:Java网络爬虫实操(6)