Java网络爬虫实操(5)

作者: 风行者1024 | 来源:发表于2018-02-24 12:14 被阅读53次

上一篇: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)

相关文章

  • Java网络爬虫实操(5)

    上一篇:Java网络爬虫实操(4) 大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里...

  • Java网络爬虫实操(2)

    上一篇: Java网络爬虫实操(1) 本篇文章继续介绍爬虫框架NetDiscovery的使用:如何发重复请求、如何...

  • Java网络爬虫实操(8)

    上一篇:Java网络爬虫实操(7) 大家好,本篇文章介绍一下NetDiscovery爬虫框架里的downloade...

  • Java网络爬虫实操(1)

    大家好,说起爬虫相信很多程序员都听到过,简单来讲就是自动批量抓网络上信息的程序。接下来我结合github上一个爬虫...

  • Java网络爬虫实操(9)

    上一篇:Java网络爬虫实操(8) 大家好,上一篇讲到了下载器。这篇介绍爬虫框架NetDiscovery新增的Fi...

  • Java网络爬虫实操(10)

    上一篇:Java网络爬虫实操(9) 各位好,马上又是618购物节了,大家的购物热情多少有点被勾起吧。相信大家最频繁...

  • Java网络爬虫实操(3)

    上一篇:Java网络爬虫实操(2) 本篇文章主要介绍NetDiscovery框架中pipeline模式的一些实际使...

  • Java网络爬虫实操(4)

    上一篇:Java网络爬虫实操(3) 本篇文章继续围绕NetDiscovery框架中pipeline的用法,结合另一...

  • Java网络爬虫实操(6)

    上一篇:Java网络爬虫实操(5) 大家好,前几篇文章一直提到用xpath去解析html。由于是演示代码,所以看上...

  • Java网络爬虫实操(7)

    上一篇:Java网络爬虫实操(6) 大家好,我们平常浏览网页经常会看到这样的效果:鼠标滚动到差不多底部的时候,才会...

网友评论

    本文标题:Java网络爬虫实操(5)

    本文链接:https://www.haomeiwen.com/subject/fbnfxftx.html