
本书以Java为开发语言,系统地介绍了网络爬虫的理论知识和基础工具,包括网络爬虫涉及的Java基础知识、HTTP协议基础与网络抓包、网页内容获取、网页内容解析和网络爬虫数据存储等。本书选取典型网站,采用案例讲解的方式介绍网络爬虫中涉及的问题,以增强读者的动手实践能力。同时,本书还介绍了3种Java网络爬虫开源框架,即Crawler4j、WebCollector和WebMagic。本书适用于Java网络爬虫开发的初学者和进阶者;也可作为网络爬虫课程教学的参考书,供高等院校文本挖掘、自然语言处理、大数据商务分析等相关学科的大学生和研究生参考使用;也可供企业网络爬虫开发人员参考使用。
前言 近几年,网络空间大数据(Big Data)已成为各领域研究的热门话题。在企业应用方面,天猫利用海量的用户数据挖掘年轻消费者偏好,并将用户偏好反馈给手机研发部门,将其用于手机设计;汽车之家利用平台中用户生成的大数据对用户进行画像,在此基础上开展个性化营销。在学术界,很多领域的学者针对大数据衍生出的新问题开展学术研究,如大数据驱动的客户洞察、大数据驱动的个性化推荐、大数据驱动的管理决策等。 在网络大数据环境下,数据采集尤为重要。因此,很多企业都提供了(高级)数据采集工程师的职位。对于很多在校大学生而言,尤其是硕士生和博士生,网络数据采集是一项必备的技能。 在编写本书之前,笔者主要从事数据采集系统的设计与开发工作。在CSDN 社区上,笔者撰写过一系列介绍Java 网络爬虫的博客,这些博客为笔者的主页带来了不少访问量;同时,也有许多博客读者通过邮件的方式,向笔者咨询网络爬虫相关的工具使用、程序调试等问题。为此,笔者对Java 网络爬虫所涉及的知识与技术进行了系统的梳理,并打算编写一本关于Java 网络爬虫的书籍。在写作过程中,笔者与具有丰富网络爬虫教学经验的姜元春教授就写作逻辑、介绍的知识点、使用的案例等多方面的内容进行了多次讨论。本书的内容更加注重爬虫理论、开发基础与实战演练。基于对本书爬虫案例的研读,读者可以快速开发自己需要的其他网络爬虫程序。 本书的内容 本书分为9 章,具体内容如下所示。 第1 章至第3 章:这3 章重点介绍与网络爬虫开发相关的基础知识,其中包括网络爬虫的原理、Java 基础知识和HTTP 协议等内容。 第4 章至第6 章:这3 章分别从网页内容获取、网页内容解析和网络爬虫数据存储3 个方面介绍网络爬虫开发过程中所涉及的一系列技术。在这3 章中,涉及很多开源工具的使用,如Jsoup、HttpClient、HtmlCleaner、Fastjson、POI3 等。 第 7 章:本章利用具体的实战案例,讲解网络爬虫开发的流程。通过对本章的学习,读者可以轻松开发Java 网络爬虫。 第8 章:针对一些复杂的页面,如动态加载的页面(执行JavaScript 脚本),本章介绍了一款实用的工具——Selenium WebDriver。 第9 章:本章重点介绍了3 种比较流行的Java 网络爬虫开源框架,即Crawler4j、WebCollector 和WebMagic。读者可根据数据采集需求,自行开发支持多线程采集、断点采集、代理切换等功能的网络爬虫项目。 本书的特色 注重基础:俗话说,基础不牢,地动山摇。本书从可读性和实用性出发,重点介绍了网络爬虫中涉及的基础知识。 系统性:本书系统地梳理了网络爬虫的逻辑和开发网络爬虫需要掌握的技术。对网络爬虫初学者和进阶者而言,学习这些内容将有利于解决数据采集过程中遇到的各种问题。 详细的案例讲解:本书选取了较为典型的网站,讲解网络爬虫经常遇到的问题,如HTTPS 请求认证问题、大文件内容获取问题、模拟登录问题、不同格式文件(文本、图片和PDF 等)的存储问题、定时数据采集问题等。 开源框架: 本书介绍了3 种Java 网络爬虫开源框架,即Crawler4j、WebCollector和WebMagic。通过对这3 种网络爬虫开源框架的学习,读者可以轻松开发一些高性能的网络爬虫项目。 完整的代码:为便于读者学习,对于每个数据网络爬虫项目,笔者都提供了完整的代码,并且在代码中给出了清晰的注释。 适合的读者 Java 网络爬虫开发的初学者和进阶者。 科研人员,尤其是从事网络大数据驱动研究的硕士生和博士生。 开设相关课程的高等院校的师生。 企业网络爬虫开发人员。 说明 网络爬虫作为一项技术,更应该服务于社会。在使用该技术的过程中,应遵守Robots 协议(互联网行业数据抓取的道德协议)。同时,需要注意对数据所涉及的知识产权和隐私信息进行保护。另外,采集数据时,需要注意礼貌,即不频繁地请求网页,以防止给数据提供者的服务器造成不良影响。在使用所采集的数据时,需要注意是否涉及商业利益和相关法律。最后,本书中所有使用的案例皆为测试案例,仅供读者学习使用,本书中的URL 均做了处理。 基金项目 本书由国家自然科学基金重大项目课题“面向大数据的商务分析与计算方法以及支撑平台研究(71490725)”、国家自然科学基金重大研究计划子课题“面向商务领域的大数据资源池及集成示范平台(91746302)”、国家自然科学基金优秀青年基金“个性化营销理论与方法(71722010)”提供资助。 勘误 由于笔者的水平有限,书中难免出现一些错误及不准确之处,恳请读者批评指正。为及时更正书中不恰当的内容,笔者在CSDN 博客中创建了一个板块,读者可以将书中的问题以评论的方式进行反馈,笔者将针对这些问题进行勘误。另外,也欢迎读者通过发送电子邮件(qy20115549@126.com)的方式,反馈书稿的问题。 致谢 感谢电子工业出版社的林瑞和编辑、合肥工业大学电子商务研究所的刘业政教授和孙见山副教授等给本书提出的宝贵建议。 感谢华为的杜非、王佳佳和王锦坤师兄的帮助,是他们将我带入编程的世界。 感谢淮南师范学院的孙娜丽女士对整本书稿写作语言的梳理。 感谢合肥工业大学电子商务研究所的朱婷婷、杨露、田志强、宋颖欣、张雪、李哲、贺菲菲、叶畅、陶守正、梁瑞诚等博士参与本书内容的讨论。 最后,希望热爱网络爬虫开发的小伙伴们能够喜欢本书。 钱 洋 2019 年9 月
目录 第1 章 网络爬虫概述与原理 ............................................................................ 1 1.1 网络爬虫简介 ............................................................................................. 1 1.2 网络爬虫分类 ............................................................................................. 2 1.3 网络爬虫流程 ............................................................................................. 4 1.4 网络爬虫的采集策略 ................................................................................. 5 1.5 学习网络爬虫的建议 ................................................................................. 5 1.6 本章小结 ..................................................................................................... 6 第2 章 网络爬虫涉及的Java 基础知识 ........................................................... 7 2.1 开发环境的搭建 ......................................................................................... 7 2.1.1 JDK 的安装及环境变量配置 .......................................................... 7 2.1.2 Eclipse 的下载 .................................................................................. 9 2.2 基本数据类型 ........................................................................................... 10 2.3 数组 ........................................................................................................... 11 2.4 条件判断与循环 ....................................................................................... 12 2.5 集合 ........................................................................................................... 15 2.5.1 List 和Set 集合 .............................................................................. 15 2.5.2 Map 集合 ........................................................................................ 16 2.5.3 Queue 集合 ..................................................................................... 17 2.6 对象与类 ................................................................................................... 19 2.7 String 类 ..................................................................................................... 21 2.8 日期和时间处理 ....................................................................................... 23 2.9 正则表达式 ............................................................................................... 26 2.10 Maven 工程的创建 ................................................................................. 29 2.11 log4j 的使用 ............................................................................................ 33 2.12 本章小结 ................................................................................................. 40 第3 章 HTTP 协议基础与网络抓包 ............................................................... 41 3.1 HTTP 协议简介 ........................................................................................ 41 3.2 URL ........................................................................................................... 42 3.3 报文 ........................................................................................................... 44 3.4 HTTP 请求方法 ........................................................................................ 46 3.5 HTTP 状态码 ............................................................................................ 46 3.5.1 状态码2XX .................................................................................... 47 3.5.2 状态码3XX .................................................................................... 47 3.5.3 状态码4XX .................................................................................... 48 3.5.4 状态码5XX .................................................................................... 48 3.6 HTTP 信息头 ............................................................................................ 48 3.6.1 通用头 ............................................................................................ 49 3.6.2 请求头 ............................................................................................ 52 3.6.3 响应头 ............................................................................................ 55 3.6.4 实体头 ............................................................................................ 56 3.7 HTTP 响应正文 ........................................................................................ 57 3.7.1 HTML ............................................................................................. 58 3.7.2 XML ............................................................................................... 60 3.7.3 JSON ............................................................................................... 61 3.8 网络抓包 ................................................................................................... 64 3.8.1 简介 ................................................................................................ 64 3.8.2 使用情境 ........................................................................................ 65 3.8.3 浏览器实现网络抓包 ..................................................................... 65 3.8.4 其他网络抓包工具推荐 ................................................................. 70 3.9 本章小结 ................................................................................................... 70 第4 章 网页内容获取 .................................................................................... 71 4.1 Jsoup 的使用 ............................................................................................. 71 4.1.1 jar 包的下载 ................................................................................... 71 4.1.2 请求URL ....................................................................................... 72 4.1.3 设置头信息 .................................................................................... 75 4.1.4 提交请求参数 ................................................................................ 78 4.1.5 超时设置 ........................................................................................ 80 4.1.6 代理服务器的使用 ......................................................................... 81 4.1.7 响应转输出流(图片、PDF 等的下载)..................................... 83 4.1.8 HTTPS 请求认证 ........................................................................... 85 4.1.9 大文件内容获取问题 ..................................................................... 89 4.2 HttpClient 的使用 ...................................................................................... 91 4.2.1 jar 包的下载 ................................................................................... 91 4.2.2 请求URL ....................................................................................... 92 4.2.3 EntityUtils 类 .................................................................................. 97 4.2.4 设置头信息 .................................................................................... 98 4.2.5 POST 提交表单 ............................................................................ 100 4.2.6 超时设置 ...................................................................................... 103 4.2.7 代理服务器的使用 ....................................................................... 105 4.2.8 文件下载 ...................................................................................... 106 4.2.9 HTTPS 请求认证 ......................................................................... 108 4.2.10 请求重试 .................................................................................... 111 4.2.11 多线程执行请求 ......................................................................... 114 4.3 URLConnection 与HttpURLConnection ................................................ 117 4.3.1 实例化 .......................................................................................... 117 4.3.2 获取网页内容 .............................................................................. 118 4.3.3 GET 请求 ...................................................................................... 118 4.3.4 模拟提交表单(POST 请求) .................................................... 119 4.3.5 设置头信息 .................................................................................. 120 4.3.6 连接超时设置 .............................................................................. 121 4.3.7 代理服务器的使用 ....................................................................... 122 4.3.8 HTTPS 请求认证 ......................................................................... 122 4.4 本章小结 ................................................................................................. 124 第5 章 网页内容解析 .................................................................................. 125 5.1 HTML 解析 ............................................................................................. 125 5.1.1 CSS 选择器 .................................................................................. 125 5.1.2 Xpath 语法 .................................................................................... 127 5.1.3 Jsoup 解析HTML ........................................................................ 128 5.1.4 HtmlCleaner 解析HTML ............................................................. 135 5.1.5 HTMLParser 解析HTML ............................................................ 139 5.2 XML 解析 ............................................................................................... 144 5.3 JSON 解析 ............................................................................................... 145 5.3.1 JSON 校正 .................................................................................... 145 5.3.2 org.json 解析JSON ...................................................................... 147 5.3.3 Gson 解析JSON........................................................................... 152 5.3.4 Fastjson 解析JSON ...................................................................... 157 5.3.5 网络爬虫实战演练 ....................................................................... 159 5.4 本章小结 ................................................................................................. 165 第6 章 网络爬虫数据存储 ........................................................................... 166 6.1 输入流与输出流 ..................................................................................... 166 6.1.1 简介 .............................................................................................. 166 6.1.2 File 类 ........................................................................................... 166 6.1.3 文件字节流 .................................................................................. 169 6.1.4 文件字符流 .................................................................................. 172 6.1.5 缓冲流 .......................................................................................... 176 6.1.6 网络爬虫下载图片实战 ............................................................... 180 6.1.7 网络爬虫文本存储实战 ............................................................... 184 6.2 Excel 存储 ............................................................................................... 188 6.2.1 Jxl 的使用 ..................................................................................... 188 6.2.2 POI 的使用 ................................................................................... 191 6.2.3 爬虫案例 ...................................................................................... 198 6.3 MySQL 数据存储 ................................................................................... 202 6.3.1 数据库的基本概念 ....................................................................... 203 6.3.2 SQL 语句基础 .............................................................................. 203 6.3.3 Java 操作数据库 .......................................................................... 207 6.3.4 爬虫案例 ...................................................................................... 217 6.4 本章小结 ................................................................................................. 219 第7 章 网络爬虫实战项目 ........................................................................... 220 7.1 新闻数据采集 ......................................................................................... 220 7.1.1 采集的网页 .................................................................................. 220 7.1.2 框架介绍 ...................................................................................... 222 7.1.3 程序编写 ...................................................................................... 223 7.2 企业信息采集 ......................................................................................... 235 7.2.1 采集的网页 .................................................................................. 235 7.2.2 框架介绍 ...................................................................................... 238 7.2.3 第一层信息采集........................................................................... 239 7.2.4 第二层信息采集........................................................................... 248 7.3 股票信息采集 ......................................................................................... 256 7.3.1 采集的网页 .................................................................................. 256 7.3.2 框架介绍 ...................................................................................... 257 7.3.3 程序设计 ...................................................................................... 258 7.3.4 Quartz 实现定时调度任务 ........................................................... 267 7.4 本章小结 ................................................................................................. 271 第8 章 Selenium 的使用 ............................................................................. 272 8.1 Selenium 简介 ......................................................................................... 272 8.2 Java Selenium 环境搭建 ......................................................................... 272 8.3 浏览器的操控 ......................................................................................... 274 8.4 元素定位 ................................................................................................. 276 8.4.1 id 定位 .......................................................................................... 276 8.4.2 name 定位 ..................................................................................... 277 8.4.3 class 定位 ...................................................................................... 278 8.4.4 tag name 定位 ............................................................................... 278 8.4.5 link text 定位 ................................................................................ 278 8.4.6 Xpath 定位 .................................................................................... 279 8.4.7 CSS 选择器定位 .......................................................................... 279 8.5 模拟登录 ................................................................................................. 280 8.6 动态加载JavaScript 数据(操作滚动条) ........................................... 283 8.7 隐藏浏览器 ............................................................................................. 285 8.8 截取验证码 ............................................................................................. 287 8.9 本章小结 ................................................................................................. 291 第9 章 网络爬虫开源框架 ........................................................................... 292 9.1 Crawler4j 的使用 .................................................................................... 292 9.1.1 Crawler4j 简介.............................................................................. 292 9.1.2 jar 包的下载 ................................................................................. 292 9.1.3 入门案例 ...................................................................................... 293 9.1.4 相关配置 ...................................................................................... 297 9.1.5 图片的采集 .................................................................................. 300 9.1.6 数据采集入库 .............................................................................. 304 9.2 WebCollector 的使用 .............................................................................. 312 9.2.1 WebCollector 简介 ....................................................................... 312 9.2.2 jar 包的下载 ................................................................................. 313 9.2.3 入门案例 ...................................................................................... 313 9.2.4 相关配置 ...................................................................................... 318 9.2.5 HTTP 请求扩展............................................................................ 319 9.2.6 翻页数据采集 .............................................................................. 327 9.2.7 图片的采集 .................................................................................. 331 9.2.8 数据采集入库 .............................................................................. 334 9.3 WebMagic 的使用 ................................................................................... 347 9.3.1 WebMagic 简介 ............................................................................ 347 9.3.2 jar 包的下载 ................................................................................. 347 9.3.3 入门案例(翻页数据采集) ....................................................... 347 9.3.4 相关配置 ...................................................................................... 351 9.3.5 数据存储方式 .............................................................................. 352 9.3.6 数据采集入库 .............................................................................. 355 9.3.7 图片的采集 .................................................................................. 365 9.4 本章小结 ................................................................................................. 368