难道 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<String> urlQueue = new LinkedList<String>();

//添加要采集的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.认知基础课程

2. java入门阶段

3. 面向对象编程

4. 飞机小项目

5. 面向对象和数组

6. 常用类

7. 异常机制

8. 容器和数据结构

9. IO流技术

10. 多线程

11. 网络编程

12. 手写服务器

13. 注解和反射

14. GOF23种设计模式

15. 正则表达式

16. JDBC数据库操作

17. 手写SORM框架

18. JAVA10新特性

19.数据结构和算法

20. JVM虚拟机讲解

21. 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.分布式部署

第九阶段:毕设项目第一季

1. 电子政务网

2. 企业合同管理系统

3. 健康管理系统

4. 商品供应管理系统

5. 土地档案管理系统

6. 聊天室设计和实现

7. 码头配套和货柜管理系统

8. 百货中心供应链系统

9. 病历管理系统

10. 超市积分管理系统

11. 动漫论坛

12. 俄罗斯方块

13. 个人博客系统

14. 固定资产管理系统

15. 影视创作论坛

16. 屏幕截图工具

17. 超级玛丽游戏

18. 飞机大战游戏

19. 雷电

第十阶段:毕设项目第二季

1. 微博系统

2. 写字板

3. 坦克大战

4. 推箱子

5. 电脑彩票系统

6. 记账管理系统

7. 新闻发布系统

8. 医院挂号系统

9. 仓库管理系统

10. 停车场管理系统

11. 网络爬虫

12. 酒店管理系统

13. 企业财务管理系统

14. 车辆管理系统

15. 员工信息管理系统

16. 旅游网站

17. 搜索引擎

18. 进销存管理系统

19. 在线考试系统

20. 物流信息网

21. 住院管理系统

22. 银行柜员业务绩效系统

获取方式: 关注并私信小编 “ 学习 ”,即可免费获取!

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,344评论 0 10
  • 去年有段时间得空,就把谷歌GAE的API权威指南看了一遍,收获颇丰,特别是在自己几乎独立开发了公司的云数据中心之后...
    骑单车的勋爵阅读 20,132评论 0 41
  • 爬虫概述 1. 目录清单 爬虫简介 通用爬虫和聚焦爬虫 网络请求那些事儿 网络数据抓包分析 2. 章节内容 2.1...
    小皇帝s阅读 652评论 0 1
  • 各位:请自带饮料自带茶,自带板凳自带糖,坐好,憋说话,我讲个故事,你仔细听,讲完留作业! 很久以前,有一群美国人,...
    穿山甲救蛇精阅读 2,029评论 9 46