博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java网络爬虫实操(5)
阅读量:6331 次
发布时间:2019-06-22

本文共 4327 字,大约阅读时间需要 14 分钟。

上一篇:

大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里解析出我们想要的数据。 但是,随着前端编程技术的发展,至少十多年前开始ajax、json等技术就已经是主流了。我们在网页上看到的很多数据,都是ajax异步方式请求服务器,然后以json数据格式返回响应结果并加载到网页上的。

本篇文章的目标:使用爬虫框架,使用GET和POST两种方式,获取我们想要的json数据。

1) 获取城市名称

  • 在选择城市的下拉框里有各个省份的主流城市名称:

  • 打开浏览器,找到提供这个数据源的链接:

  • 基于现在开始写代码(代码仅仅为了演示如何获取到数据)

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等

  • 开始写代码 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

但是,得到的结果是:

为什么? 不要被提示文字所迷惑,明明是第一次访问,不可能是频繁操作导致的。 返回这种结果是网站服务端设计的一种反爬虫手段。 网站服务端识别到不是人在用浏览器访问它,所以返回这个结果出来。 所以,程序要做到尽量真实的模拟浏览器的操作,让网站服务端认为是浏览器在访问。

如何尽量真实模拟? 用程序把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
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上的,您的点赞是框架不断完善的动力!

本文仅用于交流编程技术,不建议频繁访问他人的生产服务器

下一篇:

转载地址:http://ozboa.baihongyu.com/

你可能感兴趣的文章
Problem E
查看>>
判断闰年的流程图
查看>>
看《米花之味》
查看>>
1075. 链表元素分类(25)
查看>>
FC 坦克大战 老巢铁墙
查看>>
Centos7 下nginx nginx-1.13.4 安装
查看>>
HEOI2018游记
查看>>
Shell脚本基础
查看>>
hdu 1541 树状数入门
查看>>
EF 5.0 帮助类
查看>>
tomcat源码解读(1)–tomcat热部署实现原理
查看>>
Jmeter(一)http接口添加header和cookie --转载
查看>>
团队作业——Alpha冲刺 6/12
查看>>
Windows 下 tail 查看日志命令工具分享
查看>>
模版编程--类模版
查看>>
win32下创建窗口
查看>>
10个随机数相加等于100
查看>>
105、Replicated Mode VS Global Mode (Swarm12)
查看>>
13-计算最长英语单词链
查看>>
asp快速开发方法之分页函数
查看>>