Java網絡爬蟲實操(5)

上一篇:Java網絡爬蟲實操(4)前端

你們好,前幾篇文章介紹的URL都是返回HTML內容的,而後再從HTML字符串裏解析出咱們想要的數據。 可是,隨着前端編程技術的發展,至少十多年前開始ajax、json等技術就已是主流了。咱們在網頁上看到的不少數據,都是ajax異步方式請求服務器,而後以json數據格式返回響應結果並加載到網頁上的。java

本篇文章的目標:使用NetDiscovery爬蟲框架,使用GET和POST兩種方式,獲取咱們想要的json數據。git

1) 獲取城市名稱

  • 在選擇城市的下拉框裏有各個省份的主流城市名稱: github

    選擇城市

  • 打開瀏覽器,找到提供這個數據源的連接:ajax

猜想估計是這個
預覽一下返回的數據

  • 基於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類json

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) 獲取招聘崗位

  • 一樣的方法,先用瀏覽器人肉分析一下目標對象: 瀏覽器

    目標

  • 再看一下要傳遞的參數bash

要分得清GET和POST傳遞參數的區別,服務器

對於POST參數的類型要有概念: application/json、application/x-www-form-urlencode等

POST請求

  • 開始寫代碼 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<String,Object> 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

可是,獲得的結果是:

沒獲得咱們想要的結果

爲何? 不要被提示文字所迷惑,明明是第一次訪問,不多是頻繁操做致使的。 返回這種結果是網站服務端設計的一種反爬蟲手段。 網站服務端識別到不是人在用瀏覽器訪問它,因此返回這個結果出來。 因此,程序要作到儘可能真實的模擬瀏覽器的操做,讓網站服務端認爲是瀏覽器在訪問。

如何儘可能真實模擬? 用程序把request裏的數據都儘可能搞到程序裏

http請求的headers

按照經驗,通常先設置一下Referer和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<String,Object> 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)

相關文章
相關標籤/搜索