
从头开始学Java数据采集
本专栏系统地梳理了Java数据采集的各个核心知识点,并对其进行讲解和演示。
lwen.steven
学好Java,为公司“添砖加瓦”!
展开
-
7.3 相关配置
在程序7-1中,使用Site类中的方法配置了网页的重试次数和页面请求之间的时间间隔。查看Site类的源码可以发现,它还可以配置网络爬虫的其它信息。1.循坏重试次数为防止某些网络原因导致URL请求失败,WebMagic加入了循环重试机制。该机制会将请求失败的URL重新加入到待请求URL队列的尾部,继续请求,直到达到重试次数。为实现这个机制,需要调用Site类的setCycleRetryTimes()方法,该方法使用示例如下所示。Site site = Site.me().setCycleRetryTim原创 2020-07-01 01:27:56 · 226 阅读 · 0 评论 -
7.2 入门案例
下面,以抓取优快云博客内容为例,介绍WebMagic的使用。使用WebMagic采集数据,只需要编写一个爬虫类,实现PageProcessor接口,如程序7-1所示。优快云Processor类实现了PageProcessor接口中的getSite()和process()方法。其中,getSite()方法用于配置网络爬虫,process()方法用来实现页面操作。从程序7-1中,可以看到配置网络爬虫时需要使用Site类中的相关方法,如调用setRetryTimes()方法设置网页请求重试次数,调用set原创 2020-07-01 01:27:45 · 203 阅读 · 0 评论 -
7.1 WebMagic环境搭建
1.简介WebMagic是一个非常优秀的Java开源爬虫框架,其功能覆盖了网络爬虫的整个生命周期,包括URL提取、网页内容下载、网页内容解析和数据存储。WebMagic项目的源码可以在github上进行下载。2.引入依赖在Idea或者Eclipse中创建Maven工程,并在Maven工程的pom.xml文件中添加WebMagic的dependency,本专栏采用的版本是0.7.3。<dependency> <groupId>us.codecraft</group原创 2020-07-01 01:27:24 · 348 阅读 · 0 评论 -
6.8 Selenium动态加载Javascript
在使用Jsoup和HttpClient直接请求URL时,有时候会发现响应得到的HTML中包含的信息不全,未展示的信息必须通过执行页面中的JavaScript代码才能展示。相比较于Jsoup和HttpClient,Selenium可以利用JavascriptExecutor接口执行任意JavaScript代码。下面以程序6-21来演示Selenium动态加载JavaScript代码。程序6-21演示效果:打开百度首页,利用js代码执行输入“医药库”进行搜索。等待页面元素加载完成后,执行js脚本将滚动条拉到最原创 2020-07-01 01:27:13 · 911 阅读 · 0 评论 -
6.7 Selenium操作iframe中的元素
1.简介当元素无法定位时,需要检查定位的元素是否在iframe里面。iframe是HTML中用于网页嵌套的,一个网页可以嵌套到另一个网页中,并且可以嵌套多层。2.案例程序6-20演示效果:打开含有iframe的网页,在主窗口的输入框中输入“main input”,停留2秒后,切换到iframe中,在输入框中输入“iFrame input”,再次停留2秒后,回到主窗口,并在输入框中输入“main input again”。包含iframe的HTML代码如下所示。//main.html<html原创 2020-07-01 01:26:57 · 807 阅读 · 0 评论 -
6.6 Selenium操作弹出对话框
1.警告框警告框的作用是提示用户相关信息的验证结果、错误或警告。程序6-17演示效果:打开含有警告框的网页,等待2秒后输出警告框信息,点击确认后退出。含有警告框的网页HTML代码如下所示。<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>alert</title> </head> <body> <script>原创 2020-07-01 01:26:46 · 676 阅读 · 0 评论 -
6.5 Selenium操作弹出窗口
1.原理在代码里,通过Set allWindowsId = driver.getWindowHandles();来获取所有弹出浏览器的句柄,然后遍历,使用swithcto.window(newwindow_handle)方法定位到新的窗口。2.案例程序6-16演示效果:首先打开优快云博客首页,停留2秒后输出标题名称。然后点击创作中心按钮跳转到创作中心页面,由于未进行登录,因此跳转后的页面会是登录页,通过遍历句柄获取新窗口并输出标题名称,最后再回到父窗口并输出标题名称。//程序6-16public原创 2020-07-01 01:26:35 · 628 阅读 · 0 评论 -
6.4 Selenium操作页面元素
1.输入框Text和按钮Button程序6-13演示效果:首先打开百度首页,在输入框输入“医药库”,停留2秒后然后打印输入框元素的值,然后再停留2秒后点击搜索按钮并输出搜索按钮是否被点击,再次停留2秒后清空输入框。//程序6-13public class TextOperation { public static void main(String[] args) throws InterruptedException { WebDriver driver = WebDrive原创 2020-07-01 01:26:18 · 981 阅读 · 0 评论 -
6.3 Selenium操作浏览器
1.浏览器的跳转、前进、后退以及刷新程序6-10演示效果:打开优快云博客首页,停留2秒后进行刷新操作。紧接着跳转到百度首页,停留2秒后进行回退操作,再次进入到优快云博客首页。再次停留2秒后进行前进操作,重新回到百度首页。//程序6-10public class BrowserOperation { public static void main(String[] args) throws InterruptedException { WebDriver driver =原创 2020-07-01 01:26:03 · 125 阅读 · 0 评论 -
6.2 Selenium定位元素
在使用Selenium时,往往需要先通过定位器找到响应的元素,然后再进行其他操作。Selenium WebDriver提供多种定位策略,如id定位、name定位、class定位、tag name定位、link text定位、Xpath定位和CSS定位等。下面将分别介绍这些定位策略。1.id定位id定位,即通过id在网页中查询元素,使用简单且常用。例如,在百度首页的搜索框输入“医药库”后点击搜索按钮进行搜索。搜索框和搜索按钮元素HTML代码分别如下。<input id="kw" name="wd"原创 2020-07-01 01:25:14 · 190 阅读 · 0 评论 -
6.1 Selenium环境搭建
1.简介Selenium WebDriver主要应用于程序与浏览器之间的交互,其可以用来实现数据的采集。Selenium不自带浏览器,需要与第三方浏览器结合使用,如本章与Selenium结合使用的浏览器为谷歌浏览器,相比Jsoup和HttpClient等工具,Selenium有其特有优势,如自动加载页面、执行JavaScript脚本、模拟真实的浏览器操作等。2.引入依赖在Idea或者Eclipse中创建Maven工程,并在Maven工程的pom.xml文件中添加Selenium的dependency,原创 2020-07-01 01:25:04 · 274 阅读 · 0 评论 -
5.3 网络数据Mysql存储
针对较大规模的数据,可使用数据库进行存储。数据库是基于数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建、访问、管理、搜索和复制所存储的数据。目前,Oracle旗下的Mysql是最流行的关系型数据库管理系统,其具有体积小、性能高、开源免费等特点。本小节以程序5-3来演示如何将采集到的药监局国产药品数据存储到Mysql数据库中(读者需具备Java、Spring、SpringMVC、Mybatis以及Mysql基础)。请读者自行搭建SSM框架,然后参照下述三层代码将药监局国产药原创 2020-07-01 01:24:52 · 284 阅读 · 0 评论 -
5.2 网络数据Excel存储
网络爬虫在采集少量数据时,可以使用Excel进行存储。 Java中主要有两款操作Excel的工具JXL(主要处理xls格式的Excel)和POI(可处理xls、xlsx、word等格式的文件)。本小节利用POI封装了Excel读取和写入方法,供读者参考。使用Excel存储数据之前,需要在Maven工程的pom.xml文件中添加Excel的dependency。<dependency> <groupId>org.apache.poi</groupId> <原创 2020-07-01 01:24:40 · 284 阅读 · 0 评论 -
5.1 网络数据文本存储
在网络爬虫中,经常需要读取数据和写入数据。例如,将存储在txt文档中的待采集URL列表读入程序;将采集的图片、PDF和压缩包等文件写入指定目录。这些操作,都依赖于输入流和输出流。本专栏主要以介绍网络爬虫技术为主,因而,本小节不再详细介绍输入流和输出流,仅以程序5-1,来演示将采集到的URL存储到txt文件中,代码示例如下。//程序5-1public class TxtStorage { public static void main(String[] args) throws IOExcept原创 2020-07-01 01:10:47 · 259 阅读 · 0 评论 -
4.4 JSON解析
使用网络爬虫向服务器发送请求时,服务器经常返回包含JSON字符串的数据,此时需要对服务器返回的JSON字符串进行解析。目前,主流的JSON解析框架有org.json、Gson以及阿里巴巴开源的Fastjson,本节以Fastjson为例演示如何解析JSON字符串。1.引入依赖Fastjson是阿里巴巴公司基于Java语言开发的高性能且完善的JSON操作类库。使用前,在Maven工程的pom.xml文件中配置所需要的dependency。<dependency> <groupId&原创 2020-07-01 01:10:35 · 170 阅读 · 0 评论 -
4.3 XML解析
Jsoup既可以解析HTML,也可以用于解析XML。在本节中,将使用Jsoup解析XML。如程序4-4所示,解析下图中note的四个子节点,输出节点名称和文本信息。由代码可知,Jsoup解析XML的方法与解析HTML的方法相同,皆为CSS选择器选择元素。//程序4-4public class JsoupXML { public static void main(String[] args) throws IOException { //获取URL对应的HTML内容原创 2020-07-01 01:10:24 · 121 阅读 · 0 评论 -
4.2 JsoupXpath解析
Jsoup在选择节点或元素时,支持的是CSS,而不支持Xpath语法。而JsoupXpath则在Jsoup的基础上扩展支持Xpath语法的HTML文件解析器。使用JsoupXpath解析HTML文件之前,需要在Maven工程的pom.xml文件中添加JsoupXpath的dependency。<!-- https://mvnrepository.com/artifact/cn.wanghaomiao/JsoupXpath --><dependency> <groupI原创 2020-07-01 01:10:11 · 1678 阅读 · 0 评论 -
4.1 Jsoup解析
在上一章介绍了如何使用Jsoup获取网页资源,本节将重点介绍Jsoup的解析功能。Jsoup依赖于CSS选择器与jQuery方法来操作HTML文件中的数据。使用Jsoup解析前,需要了解Node、Element和Document的概念以及CSS选择器、Jsoup获取元素和Jsoup获取元素文本的方法。1.Node、Element和Document简介节点(Node):HTML文件中所包含的内容都可以看成一个节点。节点有很多种类型,如属性节点(Attribute)、注释节点(Node)、文本节点(Text原创 2020-07-01 01:09:59 · 436 阅读 · 0 评论 -
3.2.10 HttpClient多线程执行请求
4.5版本的HttpClient中的连接池管理器PoolingHttpClientConnectionManager类实现了HTTP连接池管理,其管理连接的单位为路由(Route),每个路由维护一定数量(默认是2)的连接;当给定路由的所有连接都被租用时,则新的连接将发生阻塞,直到某连接被释放回连接池。PoolingHttpClientConnectionManager维护的连接次数也受总数MaxTotal(默认是20)的限制。当HttpClient配置了PoolingHttpClientConnectio原创 2020-07-01 00:16:47 · 501 阅读 · 0 评论 -
3.2.9 HttpClient请求重试
使用HttpClient请求URL时,有时候会出现请求异常的情况。针对一些非致命的异常,可以通过请求重试解决。HttpClient提供了默认重试策略DefaultHttpRequestRetryHandler。DefaultHttpRequestRetryHandler类实现了HttpRequestRetryHandler接口,重写了retryRequest()方法。查看DefaultHttpRequestRetryHandler的源码可以发现DefaultHttpRequestRetryHandler类定原创 2020-07-01 00:16:32 · 1322 阅读 · 0 评论 -
3.2.8 HttpClient文件下载
下载HTML、图片、PDF和压缩等文件时,通常会采用两种方法。一种方法是,使用HttpEntity类将响应实体转换成字节数据,再利用输出流的方式写入到指定文件。另一种方法是使用HttpEntity类中的writeTo(OutputStream)方法,直接将响应实体写入指定的输出流中,这种方法简单且常用。如程序3-20所示,使用writeTo(OutputStream)方法下载"png"格式的图片文件。//程序3-20public class HttpClientDownloadFile { pu原创 2020-07-01 00:16:22 · 323 阅读 · 0 评论 -
3.2.7 HttpClient代理服务器的使用
在3.2.6节中,已经介绍了RequestConfig类来进行超时时间的设置,本节将直接使用该类来配置代理服务器进行访问,程序3-19为针对实例化的请求方法配置代理服务器。//程序3-19public class HttpClientProxy { public static void main(String[] args) throws Exception { //实例化httpClient HttpClient httpClient = HttpClients原创 2020-07-01 00:16:05 · 211 阅读 · 0 评论 -
3.2.6 HttpClient超时设置
使用HttpClient可配置三种超时时间:RequestTimeOut(获取链接超时时间) 、connectTimeOut(建立链接超时时间)、SocketTimeOut(获取数据超时时间)。配置这三种超时时间,需要用到HttpClient的RequestConfig类中的custom()方法,该方法返回值为实例化内部类的Builder(配置器)。程序3-18是HttpClient进行超时设置的代码案例。//程序3-18public class HttpClientTimeout { publ原创 2020-07-01 00:15:50 · 847 阅读 · 0 评论 -
3.2.5 HttpClient提交请求参数
网页提交表单数据,涉及到一系列请求参数。GET请求的参数,是通过URL传递的,通常以“?key1=value1&key2=value2”的形式进行传递。 POST请求的参数,通常是放在POST请求的消息体中,格式一般为JSON。例如,在某快递网站中输入快递单号查询快递信息,通过网络抓包获取的请求信息如下图所示,请求的方法为POST,提交的参数有2个。请求地址:https://www.kuaidi100.com/autonumber/autoComNum。快递单号:73123917441103。原创 2020-07-01 00:15:20 · 318 阅读 · 0 评论 -
3.2.4 HttpClient设置头信息
在网络爬虫中,经常需要设置一些头信息。设置头信息的作用是伪装网络爬虫,使得网络爬虫请求网页更像浏览器访问网页(当然也可以通过java的selenium框架来实现),进而降低网络爬虫被网站封锁的风险。HttpClient工具提供了两种设置头信息的方法,如程序3-15以及3-16所示。//程序3-15public class HttpClientSetHeader { public static void main(String[] args) throws Exception {原创 2020-07-01 00:14:45 · 921 阅读 · 0 评论 -
3.2.3 HttpClient实体工具类
在程序3-14中,使用了HttpClient中的EntityUtils类。EntityUtils类的作用是操作响应实体。例如,数据类型为HTML响应实体,可以使用下面三种方法直接将其转换为字符串类型。public static String toString(final HttpEntity entity,final String defaultCharset)public static String toString(final HttpEntity entity,final Charset def原创 2020-07-01 00:14:27 · 253 阅读 · 0 评论 -
3.2.2 HttpClient请求URL
1.创建HttpClient实例HttpClient的重要功能是执行HTTP请求方法,获取响应资源。在执行具体的请求方法之前,需要实例化HttpClient。 实例化HttpClient的方式主要有以下5种。HttpClient httpClient = Httpclients.custom().build();HttpClient httpClient = Httpclientbuilder.create().build();HttpClient httpClient = Httpclients原创 2020-07-01 00:14:04 · 329 阅读 · 0 评论 -
3.2.1 HttpClient环境搭建
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、功能丰富的、支持HTTP协议的客户端编程工具包。相比于 java.net包中提供的URLConnection与HttpURLConnection,HttpClient增加了易用性和灵活性。在Java网络爬虫实战中,经常使用HttpClient向服务器发送请求,获取响应资源。官网提供了HttpClient的使用教程。HttpClient设计的内容较多,本节主要介绍 HttpClient的基本用法,关于其它内容,读者可以原创 2020-06-30 23:56:53 · 340 阅读 · 0 评论 -
3.1.8 Jsoup大文件内容获取
在采集数据时,经常会遇到一些较大的文件,如包含大量文本信息的HTML文件、大小超过10M的图片、PDF和ZIP等文件。在默认情况下,Jsoup最大只能获取1M的文件。因此,直接使用Jsoup请求包含大量文本信息的HTML文件,将导致获取的内容不全;请求大小超过1M的图片和ZIP等文件,将导致文件无法查看或解压。但在Jsoup中,可以使用maxBodySize(int bytes)设置请求文件大小限制,来避免这种问题的出现。例如,使用程序3-13下载SpringBoot.pdf(大小为9.5M) 时,Inte原创 2020-06-30 23:56:39 · 905 阅读 · 0 评论 -
3.1.7 Jsoup响应转输出流
使用Jsoup下载图片、PDF和压缩等文件时,需要将响应转换为输出流。转换为输出流的目的是增强写文件的能力,即以字节为单位写入指定文件。以图片下载为例,程序3-12使用bodyStream()方法将响应转换为输出流,并以缓冲流的方式写入指定文件。另外,针对图片和PDF等文件,在执行URL请求获取Response时,必须通过ignoreContentType(boolean ignoreContentType)方法设置忽略响应内容的类型,否则会报错。//程序3-12public class JsoupC原创 2020-06-30 23:56:19 · 820 阅读 · 0 评论 -
3.1.6 Jsoup代理服务器
在一般情况下,使用浏览器可以直接连接Internet站点获取网络信息,而代理服务器(Proxy Server)是网络上提供转接功能的服务器。代理服务器是介于客户端和Web服务器之间的一台服务器,基于代理服务器,浏览器不再直接从Web服务器获取数据,而是向代理服务器发送请求,信号会先发送到代理服务器,由代理服务器取回浏览器所需要的信息。可以将代理简单理解为中介。在网络爬虫中,使用代理服务器访问网页内容,能够高度隐藏爬虫的真实IP地址,从而防止网络爬虫被服务器封锁。另外,普通网络爬虫使用固定的IP地址请求时,原创 2020-06-30 23:56:03 · 563 阅读 · 0 评论 -
3.1.5 Jsoup超时设置
在网络异常的情况下,可能会发生连接超时,进而导致程序僵死而不再继续往下执行。在Jsoup请求URL时,如果发生连接超时的情况,则会抛出下图所示的异常信息。针对连接超时问题,Jsoup在请求URL时,可以由用户自行设置毫秒级别的超时时间,如程序3-8和3-9所示。如果不使用timeout方法设置超时时间,则默认超时时间为30毫秒。//程序3-8public class JsoupConnectUrl { public static void main(String[] args) throws原创 2020-06-30 23:55:30 · 1966 阅读 · 0 评论 -
3.1.4 Jsoup提交请求参数
网页提交表单数据,涉及到一系列请求参数。GET请求的参数,是通过URL传递的,通常以“?key1=value1&key2=value2”的形式进行传递。 POST请求的参数,通常是放在POST请求的消息体中,格式一般为JSON。例如,在某快递网站中输入快递单号查询快递信息,通过网络抓包获取的请求信息如下图所示,请求的方法为POST,提交的参数有2个。请求地址:https://www.kuaidi100.com/autonumber/autoComNum。快递单号:73123917441103。原创 2020-06-30 23:55:06 · 2109 阅读 · 0 评论 -
3.1.3 Jsoup设置头信息
在网络爬虫中,经常需要设置一些头信息。设置头信息的作用是伪装网络爬虫,使得网络爬虫请求网页更像浏览器访问网页(当然也可以通过java的selenium框架来实现),进而降低网络爬虫被网站封锁的风险。Jsoup中提供了两种设置头信息的方法。第一种方法:每次只设置一个请求头,如果要设置多个请求头,需要多次调用此方法;第二种方法:添加多个请求头至Map集合。在程序3-3中,设置了一个请求头。在程序3-4中,设置了多个请求头,这些请求头来源于网络抓包的内容。//程序3-3public class JsoupC原创 2020-06-30 23:26:51 · 3172 阅读 · 0 评论 -
3.1.2 Jsoup请求URL
org.jsoup.Jsoup类可以用来处理连接操作。在org.jsoup.Jsoup类中提供了connect(String url)方法来创建一个新连接,该方法的实现依赖于Java网络通信包java.net。在创建连接之后,可通过具体请求方法(GET或POST等)获取URL对应的HTML文件。如需要采集某页面中的文本内容。首先,利用谷歌浏览器进行抓包,分析请求的URL、请求的方法、请求头、响应头等信息,详细操作请参考上章内容网络抓包。程序3-1为Jsoup请求该网页的一种方式,这里使用get()方法执原创 2020-06-30 23:19:58 · 622 阅读 · 0 评论 -
3.1.1 Jsoup环境搭建
Jsoup是一款基于Java语言开发的开源项目,主要用于请求URL获取网页内容、解析HTML和XML文档。使用Jsoup可以非常轻松地构建一些轻量级的网络爬虫。在Idea或者Eclipse中创建Maven工程,并在Maven工程的pom.xml文件中添加Jsoup对应的dependency,本专栏采用的版本是1.11.3。<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --><dependency> <原创 2020-06-30 23:19:45 · 845 阅读 · 0 评论 -
2.7 网络抓包
1.简介抓包是指对网络传输中发送与接收的数据包进行拦截、重发、编辑和转存的操作。在开发网络爬虫时,给定URL,开发者必须清楚客户端是如何向服务器发送请求的,以及客户端发出请求后服务器返回的数据是什么。只有了解这些内容,开发者才能在程序中拼接URL,针对服务返回的数据类型制定具体的解析策略。因此,网络抓包是实现网络爬虫必不可少的技能之一,也是网络爬虫开发的起点。例如,采集药监局国产药品数据时,在浏览器中输入国产药品列表页URL,如图1所示。点击药品信息,浏览器显示出药品数据详情,如图2所示,但是URL却原创 2020-06-30 23:19:23 · 547 阅读 · 0 评论 -
2.6 HTTP信息头
HTTP信息头,也称为头字段或者首部,是构成HTTP报文的要素之一,具有传递额外重要信息的作用。HTTP信息头通常包括4类,通用头、请求头、响应头和实体头。其中,请求头和响应头分别只在请求信息和响应信息中出现,而通用头和实体头在请求信息和响应信息中都可出现。只有在消息中包含实体数据时,实体头才会出现。HTTP信息头是由头字段和字段值组成的,如下图所示。1.通用头通用头既可以在请求信息中出现也可以在响应信息中出现,其提供了与报文相关的基本信息。下面列出了HTTP通用头的字段名称及其功能。Cache-C原创 2020-06-30 23:18:51 · 5164 阅读 · 0 评论 -
2.5 HTTP状态码
HTTP状态码是由3位数字组成,描述了客户端向服务器请求过程中发生的情况。状态码的第一位数字描述了状况类型。HTTP状态码共分为5种类型。1**:信息,服务器收到请求,需要请求者继续执行操作。2**:成功,操作被成功接收并处理。3**:重定向,需要进一步的操作以完成请求。4**:客户端错误,请求包含语法错误或无法完成请求。5**:服务器端错误,服务器在处理请求的过程中发生了错误。下面介绍一些常见的状态码以及含义。200(OK):请求成功。一般用于GET与POST请求。204(No Co原创 2020-06-30 15:23:50 · 157 阅读 · 0 评论 -
2.4 HTTP请求方法
在客户端向服务器端发送请求时,需要确定使用的请求方法。请求方法表明对URL指定资源的操作方式,服务器会根据不同的请求方法进行不同的响应。在HTTP/1.1中,共定义了8种请求方法,具体如下。GET:请求指定的内容并返回。POST:向指定资源提交数据处理请求(例如提交表单或者上传文件)。请求数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。PUT:用客户端传送的数据取代服务器中指定的内容。DELETE:请求服务器删除指定的内容。HEAD:类似于GET请求,只不过返回的响应原创 2020-06-30 15:23:11 · 4257 阅读 · 0 评论