上一篇: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 {@Overridepublic 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<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();}
}
复制代码

服务端终于返回有数据的结果了(数据是否有用,有待进一步分析):

3) 总结

本文的知识点包括:掌握ajax异步执行的概念、了解json数据格式、学会使用调试工具,比如谷歌浏览器的Developer Tools等等。

最重要还是对http协议要有了解。

想自己亲自操作一遍的朋友们,请访问github上的NetDiscovery,您的点赞是框架不断完善的动力!

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

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

Java网络爬虫实操(5)相关推荐

  1. Java网络爬虫实操(3)

    上一篇:Java网络爬虫实操(2) 本篇文章主要介绍NetDiscovery框架中pipeline模式的一些实际使用方法. 1) 什么是pipeline pipeline是一种常见的算法模式,针对不断 ...

  2. Java网络爬虫实操(8)

    上一篇:Java网络爬虫实操(7) 大家好,本篇文章介绍一下NetDiscovery爬虫框架里的downloader对象 1) 前言 面向对象设计仍然是目前编程的核心思想,从下面截图可以了解爬虫框架的 ...

  3. java网络爬虫实验报告,Java网络爬虫实操(8)

    大家好,本篇文章介绍一下NetDiscovery爬虫框架里的downloader对象 1) 前言 面向对象设计仍然是目前编程的核心思想,从下面截图可以了解爬虫框架的主要对象: 程序在本地组织好一个re ...

  4. java spider爬虫_Java网络爬虫实操(2)

    本篇文章继续介绍爬虫框架NetDiscovery的使用:如何发重复请求.如何用爬虫容器引擎驱动爬虫程序 1 )重复请求的场景举例 从2017年下半年开始,比特币.数字货币.虚拟币.区块链技术.去中心化 ...

  5. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  6. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  7. Java网络爬虫该如何学习

    文章目录 引言 怎么入门网络爬虫 课程特色 学完本课程能收获什么 引言 互联网以及移动技术的飞速发展,使得全球数据量呈现前所未有的爆炸式增长态势.例如,用户在互联网上的搜索数据.交易数据.评论数据.社 ...

  8. java网络爬虫,乱码问题终于完美解决

    java网络爬虫,乱码问题终于完美解决 参考文章: (1)java网络爬虫,乱码问题终于完美解决 (2)https://www.cnblogs.com/-LilyBlog-/p/7593841.htm ...

  9. 在不同领域,大家用爬虫怎么盈利的-Java网络爬虫系统性学习与实战系列(4)

    在不同领域,大家用爬虫怎么盈利的-Java网络爬虫系统性学习与实战系列(4) 文章目录 概述 出行抢票软件 微博上的僵尸粉 电商比价/返利平台 社区抓取数据和内容 联系方式 系列文章地址: Java网 ...

最新文章

  1. js ajax调用请求
  2. Torch not compiled with CUDA enabled
  3. 今日发现的:一个类似Google Baidu的搜索引擎[C#]代码比较简单
  4. 记一次el-input使用的坑
  5. 《狂人日记》金句摘抄(一)
  6. Android开发笔记(四)字符串格式化
  7. director 3d tank
  8. java基础代码实例_全网都在找的Python简单基础小程序的实例代码
  9. docker在win7下的使用
  10. 超级SIM卡 SEID号读取 手机NFC门禁刷卡模块方案
  11. 登录时候输入验证码,验证码图片从服务器获取方法
  12. PR曲线和ROC曲线概念及其区别
  13. 产品笔试后不会知识点总结
  14. 前端页面--瀑布流布局的实现
  15. boss网人脸识别认证_在手机上怎样进行社保人脸识别认证
  16. C++解题报告:连续的“包含”子串长度——(线段树+尺取法)
  17. C语言 数据结构 栈的线性实现 基本操作代码
  18. 程序员 谨防猝死
  19. 云计算 | Gartner最新IaaS魔力象限详读
  20. 编写 SQL 查询表格,按创建时间降序排列。

热门文章

  1. SAP MM初阶之事务代码MIGO界面批次拆分最多输入15行?
  2. SAP RETAIL 参考PO创建分配表之二
  3. 六大基本AI术语:如何做好人工智能咨询服务?
  4. 2021年工业机器人的六大趋势
  5. AI语音算法“个性”强 与芯片端“磨合”挑战多
  6. IBM沃森健康项目受挫 人工智能在医疗领域前景几何
  7. 距离产生美?k近邻算法python实现
  8. GPT-3难以复现,为什么说PyTorch走上了一条“大弯路”?
  9. 生物战教训、生物安全问题以及未来监控军民两用生物技术扩散的手段
  10. 人工智能让育种“物美价廉”