Java网络爬虫实操(5)

上一篇:Java网络爬虫实操(4)

大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里解析出我们想要的数据。
但是,随着前端编程技术的发展,至少十多年前开始ajax、json等技术就已经是主流了。我们在网页上看到的很多数据,都是ajax异步方式请求服务器,然后以json数据格式返回响应结果并加载到网页上的。
本篇文章的目标:使用NetDiscovery爬虫框架,使用GET和POST两种方式,获取我们想要的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参数的类型要有概念:
    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
新的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协议要有了解。
想自己亲自操作一遍的朋友,请关注NetDiscovery
本文仅用于交流编程技术,不建议频繁访问他人的生产服务器

下一篇:Java网络爬虫实操(6)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,394评论 25 707
  • 当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM 和 SIGQUIT 信号。由 Bash...
    赵者也阅读 676评论 0 0
  • 小区里有几棵柚子树开满了花,白白的,一串串的,香气扑鼻,走过路过都能闻到。哪怕是此刻我坐在阁楼写这篇文字也能闻到香...
    叶样悠阅读 860评论 1 3
  • ​《三字经》开篇第一句:“人之初,性本善。” 2015年去支教,支教前的培训系列课里有几节课程是讲儿童心理学的,其...
    望月尘阅读 609评论 0 2
  • 10月31日,我辞掉了干了2年零8个月的别人认为很好的工作――医院药房药剂士。为什么要辞,因为我腻了,工作很轻松,...
    帅气的虾虾0202阅读 134评论 0 1