难道 Java 就玩不了爬虫?我来教你
本科时,毕业论文需要不少网络上用户的问答数据。那时,我还没有搞过网络爬虫,只能利用关键词搜索的方式,找到相关数据,然后一条一条复制。我也觉得这样很傻,但不得不承认这确实我最初的操作方式,很艰难,累的手疼。

后来,读研究生时,做项目的同时还要搞科研。项目和科研,都需要采集大量的网络数据。领头做项目的师兄,指定了一系列国内外网站,并把采集任务分配给我。对于当时啥都不咋会的我,内心“啥?这该咋弄啊?这咋弄啊?……”可是没办法,即便瑟瑟发抖,硬着头皮还是要上。

好在有着师兄指点,让我去学习网路爬虫,说网路爬虫可以搞定“我想要的数据”。为了“活”下去,我决定放手一搏,但在学习准备阶段我就遇到了我的第一个“爬虫难题”。


决定要用网络爬虫去采集数据,面临一个选择就是:是用Java还是Python写网络爬虫呢?对于一个新手,我翻阅了网上各种对比的帖子,各有各的观点,其中不少说Python上手容易,写起来方便。但最终我还是选择了Java,有以下几点原因:
1. Java火了很多年,而且依旧很火,其生态也比较完善。目前,很多大公司的系统皆采用Java设计,足以说明其强大之处。把Java学好了,足够让我找一份不错的工作,即入职大厂。
2. Java严谨规范,对于大型工程、大型程序,如果不规范不严谨维护岂不容易出问题。
3. 对网络爬虫而言,JAVA中也有很多简单易用的类库(如Jsoup、Httpclient等),同时还存在不少易于二次开发的网络爬虫框架(Crawler4J、WebMagic等)。
4. 曾在一个帖子中看到,“世界上99%的人都会选择一条容易走的大路,因为人都喜欢安逸。这也是人的大脑的思维方式决定的,因为大脑的使命是为了让你生存,而不是求知。但成功是总是属于那1%的人,这类人是坚持让大脑做不愿意做的事的人——求知”。哎,这在我看来,还真有一定的道理。如果励志想成为一名真正的程序员,建议先学习Java。在此基础上,如果你对Python感兴趣,也是可以快速上手的。

1 网络爬虫流程
学习网络爬虫之前,先看了普通网络爬虫大致流程,如下图所示:

主要包括5个步骤:
1. 选取部分种子URL(或初始URL),将其放入待采集的队列中。如在Java中,可以放入List、LinkedList以及Queue中。
2. 判断URL队列是否为空,如果为空则结束程序的执行,否则执行步骤3。
3. 从待采集的URL队列中取出一个URL,获取URL对应的网页内容。在此步骤需要使用HTTP响应状态码(如200和403等)判断是否成功获取到了数据,如响应成功则执行解析操作;如响应不成功,则将其重新放入待采集URL队列(注意这里需要过滤掉无效URL)。
4. 针对响应成功后获取到的数据,执行页面解析操作。此步骤根据用户需求获取网页内容中的部分字段,如汽车论坛帖子的id、标题和发表时间等。
5. 针对步骤4解析的数据,执行数据存储操作。
2 需要掌握的Java基础知识
在使用Java构建网络爬虫时,需要掌握很多Java方面的基础知识。例如,Java中基本的数据类型、Java中的数组操作、判断语句的使用、集合操作、对象和类的使用、String类的使用、日期和时间的处理、正则表达式的使用、Maven工程的创建、多线程操作、日志的使用等。

看着知识点很多,但如果将其放入到具体的网络爬虫实战项目中去学习,会发现很简单。下面,我举两个例子。
在网络爬虫中,我们经常需要将待采集的URL放到集合中,然后循环遍历集合中的每个URL去采集数据。比如,我们使用Queue集合操作:
Queue urlQueue = new LinkedList();
//添加要采集的URL
urlQueue.offer(“https://ccm.net/download/?page=1”);
urlQueue.offer(“https://ccm.net/download/?page=2”);
urlQueue.offer(“https://ccm.net/download/?page=3”);
boolean t = true;
while (t) {
//如果队列为空,循环结束
if( urlQueue.isEmpty() ){
t = false;
}else {
//取出每个URL
String url = urlQueue.poll();
//获取HTML
String getHtml = …;
//判断是否成功请求到HTML
if (成功请求到HTML) {
//解析数据
…;
}else { //如果网页存在但没有请求到数据,重新添加到队列中
urlQueue.offer(url);
}
}
}
另外,在采集数据时,不同网站的时间使用格式可能不同。而不同的时间格式,会为数据存储以及数据处理带来一定的困难。例如,下图为某汽车论坛中时间使用的格式,即“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”两种类型。

下图为某新闻网站中的时间使用格式“yyyy-MM-dd HH:mm:ss”。

再如,艺术品网站deviantart的时间使用的是UNIX时间戳的形式。

针对汽车论坛中的“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”格式,可以统一转化成“yyyy-MM-dd HH:mm:ss”格式,以方便数据存储以及后期数据处理。此时,可以写个方法将将字符串类型的时间标准化成指定格式的时间。如下程序:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeTest {
public static void main(String[] args) {
System.out.println(parseStringTime(“2016-05-19 19:17”,
“yyyy-MM-dd HH:mm”,”yyyy-MM-dd HH:mm:ss”));
System.out.println(parseStringTime(“2018-06-19”,
“yyyy-MM-dd”,”yyyy-MM-dd HH:mm:ss”));
}
/**
- 字符型时间格式标准化方法
-
@param inputTime(输入的字符串时间),inputTimeFormat(输入的格式),outTimeFormat(输出的格式).
-
@return 转化后的时间(字符串)
*/
public static String parseStringTime(String inputTime,String inputTimeFormat,
String outTimeFormat){
String outputDate = null;
try {
//日期格式化及解析时间
Date inputDate = new SimpleDateFormat(inputTimeFormat).parse(inputTime);
//转化成新的形式的字符串
outputDate = new SimpleDateFormat(outTimeFormat).format(inputDate);
} catch (ParseException e) {
e.printStackTrace();
}
return outputDate;
}
}
针对UNIX时间戳,可以通过如下方法处理:
//将unix时间戳转化成指定形式的时间
public static String TimeStampToDate(String timestampString, String formats) {
Long timestamp = Long.parseLong(timestampString) * 1000;
String date = new SimpleDateFormat(formats,
Locale.CHINA).format(new Date(timestamp));
return date;
}
3 HTTP协议基础与网络抓包
做网络爬虫,还需要了解HTTP协议相关的内容,即要清楚数据是怎么在服务器和客户端传输的。

具体需要了解的内容包括:
1. URL的组成:如协议、域名、端口、路径、参数等。
2. 报文:分为请求报文和响应报文。其中,请求报文包括请求方法、请求的URL、版本协议以及请求头信息。响应报文包括请求协议、响应状态码、响应头信息和响应内容。响应报文包括请求协议、响应状态码、响应头信息和响应内容。
3. HTTP请求方法:在客户端向服务器发送请求时,需要确定使用的请求方法(也称为动作)。请求方法表明了对URL指定资源的操作方式,服务器会根据不同的请求方法做不同的响应。网络爬虫中常用的两种请求方法为GET和POST。
4. HTTP状态码:HTTP状态码由3位数字组成,描述了客户端向服务器请求过程中发生的状况。常使用200判断网络是否请求成功。
5. HTTP信息头:HTTP信息头,也称头字段或首部,是构成HTTP报文的要素之一,起到传递额外重要信息的作用。在网络爬虫中,我们常使用多个User-Agent和多个referer等请求头来模拟人的行为,进而绕过一些网站的防爬措施。
6. HTTP响应正文:HTTP响应正文(或HTTP响应实体主体),指服务器返回的一定格式的数据。网络爬虫中常遇到需要解析的几种数据包括:HTML/XML/JSON。

在开发网络爬虫时,给定 URL,开发者必须清楚客户端是怎么向服务器发送请求的,以及客户端请求后服务器返回的数据是什么。只有了解这些内容,开发者才能在程序中拼接URL,针对服务返回的数据类型设计具体的解析策略。因此,网络抓包是实现网络爬虫必不可少的技能之一,也是网络爬虫开发的起点。
在2019年的今天,无论是 Java 还是 Python,学出来之后找工作都是很容易的,而且小编为大家准备的教程(免费)每天拿出2-3个小时自学就可以,学的时间长了,也一下子消化不了,如果你想学习的话,不如就从现在开始学习编程语言吧!

第一阶段 :Java基础

1.认知基础课程
- java入门阶段
-
面向对象编程
-
飞机小项目
-
面向对象和数组
-
常用类
-
异常机制
-
容器和数据结构
-
IO流技术
-
多线程
-
网络编程
-
手写服务器
-
注解和反射
-
GOF23种设计模式
-
正则表达式
-
JDBC数据库操作
-
手写SORM框架
-
JAVA10新特性
19.数据结构和算法
- JVM虚拟机讲解
-
XML技术解析
第二阶段:数据库开发全套课程

1.Oracle和SQL语言
2.Mysql快速使用
3.PowerDesigner使用
4.JDBC数据库
5.Mysql优化
6.oracle深度讲解
第三阶段:网页开发和设计

1.HTML基础
2.CSS基础
3.JavaScript编程
4.jQuery
5.easyUI
第四阶段:Servlet和JSP实战深入课程

1.Servlet入门和Tomcat
2.request和response对象
3.转发和重定向_Cookie
4.session_Context对象
5.JSP
6.用户管理系统
7.Ajax技术
8.EL和JSTL标签库
9.过滤器
10.监听器
第五阶段:高级框架阶段

1.Mybatis
2.Spring
3.Spring MVC
4.SSM框架整合
5.RBAC权限控制项目
6.Hibernate3
7.Hibernate4
8.jFinal
9.Shiro安全框架
10.Solr搜索框架
11.Struts2
12.Nginx服务器
13.Redis缓存技术
14.JVM虚拟机优化
15.Zookeeper
第六阶段:微服务架构阶段

1.Spring Boot
2.Spring Data
3.Spring Cloud
第七阶段:互联网架构阶段

1.Linux系统
2.Maven技术
3.Git
4.SVN
5.高并发编程
6.系统和虚拟机调优
7.JAVA编程规范
8.高级网络编程
9.Netty框架
10.ActiveMQ消息中间件
11.单点登录SSO
12.数据库和SQL优化
13.数据库集群和高并发
14.Dubbo
15.Redis
16.VSFTPD+NGINX
第八阶段:分布式亿级高并发电商项目

1.基于SOA架构介绍
2.VSFTPD和Nginx和商品新增
3.商品规格参数管理
4.Jsonp
5.CMS模块
6.广告位数据缓存
7.SolrJ和SolrCloud
8.商品搜索
9.商品详情
10.单点登录
11.购物车
12.订单系统
13.分库和分表
14.分布式部署
第九阶段:毕设项目第一季

- 电子政务网
-
企业合同管理系统
-
健康管理系统
-
商品供应管理系统
-
土地档案管理系统
-
聊天室设计和实现
-
码头配套和货柜管理系统
-
百货中心供应链系统
-
病历管理系统
-
超市积分管理系统
-
动漫论坛
-
俄罗斯方块
-
个人博客系统
-
固定资产管理系统
-
影视创作论坛
-
屏幕截图工具
-
超级玛丽游戏
-
飞机大战游戏
-
雷电
第十阶段:毕设项目第二季

- 微博系统
-
写字板
-
坦克大战
-
推箱子
-
电脑彩票系统
-
记账管理系统
-
新闻发布系统
-
医院挂号系统
-
仓库管理系统
-
停车场管理系统
-
网络爬虫
-
酒店管理系统
-
企业财务管理系统
-
车辆管理系统
-
员工信息管理系统
-
旅游网站
-
搜索引擎
-
进销存管理系统
-
在线考试系统
-
物流信息网
-
住院管理系统
-
银行柜员业务绩效系统
获取方式: 关注并私信小编 “ 学习 ”,即可免费获取!
文章来源于互联网:难道 Java 就玩不了爬虫?我来教你