上一篇:Java網絡爬蟲實操(4)前端
你們好,前幾篇文章介紹的URL都是返回HTML內容的,而後再從HTML字符串裏解析出咱們想要的數據。 可是,隨着前端編程技術的發展,至少十多年前開始ajax、json等技術就已是主流了。咱們在網頁上看到的不少數據,都是ajax異步方式請求服務器,而後以json數據格式返回響應結果並加載到網頁上的。java
本篇文章的目標:使用NetDiscovery爬蟲框架,使用GET和POST兩種方式,獲取咱們想要的json數據。git
在選擇城市的下拉框裏有各個省份的主流城市名稱: github
打開瀏覽器,找到提供這個數據源的連接:ajax
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) {
}
}
}
複製代碼
一樣的方法,先用瀏覽器人肉分析一下目標對象: 瀏覽器
再看一下要傳遞的參數bash
要分得清GET和POST傳遞參數的區別,服務器
對於POST參數的類型要有概念: application/json、application/x-www-form-urlencode等
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裏的數據都儘可能搞到程序裏
按照經驗,通常先設置一下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();
}
}
複製代碼
服務端終於返回有數據的結果了(數據是否有用,有待進一步分析):
本文的知識點包括:掌握ajax異步執行的概念、瞭解json數據格式、學會使用調試工具,好比谷歌瀏覽器的Developer Tools等等。
最重要仍是對http協議要有了解。
想本身親自操做一遍的朋友們,請訪問github上的NetDiscovery,您的點贊是框架不斷完善的動力!
本文僅用於交流編程技術,不建議頻繁訪問他人的生產服務器
下一篇:Java網絡爬蟲實操(6)