教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
教你如何使⽤Java代码从⽹页中爬取数据到数据库中——⽹络爬⾍精华篇
世界最丑十大建筑⽂章⽬录
有⼀句话说的好,只要精神不滑坡,办法总⽐困难多——阿俊(这句话可以形容我这三天学习知识的态度)
就在前天,我的⼀个项⽬进⼊到了省赛,想下定决⼼把⾃⼰的⼀部分未完成的功能完善起来(想爬取⽹页上的各种数据到⾃⼰的所对应的页⾯上显⽰),这个问题在我脑⼦⾥回旋许久,于是打开电脑就在⽹上查阅各种资料,⽽我第⼀次查就是如何使⽤Java代码从⽹页中爬取数据到数据库中,有了这⼀步我相信在显⽰到⾃⼰的界⾯上应该就是很简单的⼀件事了,那么到底如何使⽤Java代码从⽹页中爬取数据到数据库中呢?昨天我花了⼀天的时间学习这⽅⾯的内容,当然我觉得这学的只是⽚⾯知识有很多还得掌握,待以后在遇到继续解决,今天夜⾥,我决定总结昨天遇到的困难和学过的知识,以博客的形式记录下来分享给⼤家房产中介有望被取消?
1:⽹络爬⾍介绍
在⼤数据时代,信息的采集是⼀项重要的⼯作,⽽互联⽹中的数据是海量的,如果单纯靠⼈⼒进⾏信息采集,不仅低效繁琐,搜集的成本也会提⾼。如何⾃动⾼效地获取互联⽹中我们感兴趣的信息并为我们]所⽤是⼀个重要的问题,⽽爬⾍技术就是为了解决这些问题⽽⽣的。
⽹络爬⾍(Web crawler)也叫做⽹络机器⼈,可以代替⼈们⾃动地在互联⽹中进⾏数据信息的采集与整理。它是⼀种按照⼀定的规则,⾃动地抓取万维⽹信息的程序或者脚⽊,可以⾃动采集所有其能够访问到的页⽽内容,以获取相关数据。
从功能上来讲,爬⾍⼀般分为数据采集,处理,储存三个部分。爬⾍从⼀个或若⼲初始⽹页的URL开始,获得初始⽹页上的URL,在抓取⽹页的过程中,不断从当前页⽽上抽取新的URL放⼊队列,直到满⾜系统的⼀定停⽌条件。
⽹络爬⾍作⽤
4级准考证号查询
1.可以实现搜索引擎。
我们学会了爬⾍编写之后,就可以利⽤爬⾍⾃动地采集互联⽹中的信息,采集回来后进⾏相应的存储或处理,在需要检索某些信息的时候,只需在采集回来的信息中进⾏检索,即实现了私⼈的搜索引擎。
2.⼤数据时代,可以让我们获取更多的数据源。
在进⾏⼤数据分析或者进⾏数据挖掘的时候,需要有数据源进⾏分析。我们可以从某些提供数据统计的⽹站获得,也可以从某些⽂献或内部资料中获得,但是这些获得数据的⽅式,有时很难满⾜我们对数据的需求,⽽⼿动从互联⽹中去寻这些数据,则耗费的精⼒过⼤。此时就可以利⽤爬⾍技术,⾃动地从互联⽹中获取我们]感兴趣的数据内容,并将这些数据内容爬取回来,作为我们的数据源,再进⾏更深层次的数据分析,并获得更多有价值的信息。
3.可以更好地进⾏搜索引擎优化 (SEO)。
对于很多SEO从业者来说,为了更好的完成⼯作,那么就必须要对搜索引擎的⼯作原理⾮常清楚,同时也需要掌握搜索引擎爬⾍的⼯作原理。⽽学习爬⾍,可以更深层次地理解搜索引擎爬⾍的⼯作原理,这样在进⾏搜索引擎优化时,才能知⼰知彼,百战不殆。(我还没掌握这么深(狗头))
4.有利于就业。
从就业来说,爬⾍⼯程师⽅向是不错的选择之⼀,因为⽬前爬⾍程师的需求越来越⼤,⽽能够胜任这⽅⽽岗位的⼈员较少,所以属于⼀个⽐较紧缺的职业⽅向,并且随着⼤数据时代和⼈⼯智能的来临,
爬⾍技术的应⽤将越来越⼴“泛,在未来会拥有很好的发展空间。(我是搞软件开发的(狗头))
2:HttpClients类介绍
河北高考出分时间为什么讲完爬⾍介绍就直接讲这⼀个类呢?
⽹络爬⾍就是⽤程序帮助我们访问⽹络上的资源,我们⼀ 直以来都是使⽤HTTP协议访问互联⽹的⽹页,⽹络爬⾍需要编写程序,在这⾥使⽤同样的HTTP协议访问⽹页。这⾥我们使⽤Java的HTTP协议客户端HttpClients 这个技术,来实现抓取⽹页数据。
如下代码我们有些类的信息要去如下API寻(⼤家可以看它们分别引⼊类的的包就知道要怎么寻API了)
这两个API不⼀样的
我们先上⼀个简单的例⼦,来看看怎么⽤Java代码成功爬取到⽹页上的数据到控制台
public class Crawler01 {
public static void main(String[] args)throws Exception{
/
/1.打开浏览器,创建对象
CloseableHttpClient httpClient = ateDefault();
//2.⽹址
HttpGet httpGet =new HttpGet("www.baidu");
//3.发起请求
CloseableHttpResponse response = ute(httpGet);
//4.解析响应,获取数据
StatusLine().getStatusCode()==200){
HttpEntity entity = Entity();
String content = String(entity,"utf8");
System.out.println(content);
}
}
}
相关如上类的信息如下,如下代码都是借鉴API中的内容
Interface HttpEntity:可以通过HTTP消息发送或接收的实体。可以在某些请求和响应中到实体,这些实体是可选的。——Interface
Class EntityUtils:处理HttpEntitys的静态帮助程序。——Class
⽅法1:static String toString(HttpEntity entity)
读取实体的内容并将其作为字符串返回。
⽅法2:static String toString(HttpEntity entity, Charset defaultCharset)
以字符串形式获取实体内容,如果在实体中没有到,则使⽤提供的默认字符集。(字符集很关键,我当时的实验代码就是该⽅法中的字符集和页⾯上的字符集不⼀⼀对应造成的)
Interface——CloseableHttpResponse:HttpResponse接⼝的扩展版本,它也扩展了Closeable。——Interface
Class HttpGet:HTTP GET method——GET⽅法意味着检索由请求uri标识的任何信息(以实体的形式)。如果请求uri指的是⼀个数据产⽣过程,它是被产⽣的数据,应该作为响应中的实体返回,⽽不是该过程的源⽂本,除⾮该⽂本恰好是该过程的输出。 ——Class
⽅法1:public HttpGet(String uri)
Class:HttpClients: CloseableHttpClient实例的⼯⼚⽅法。 ——Class
⽅法1:static CloseableHttpClient createDefault()
使⽤默认配置创建CloseableHttpClient实例。
Class CloseableHttpClient:基于HttpClient的基本实现同时也实现了 Closeable ——Class
⽅法1: CloseableHttpResponse execute(HttpUriRequest request)
使⽤默认上下⽂执⾏HTTP请求。
Interface CloseableHttpResponse :Extended version of the HttpResponse interface that also extends Closeable.
Interface HttpResponse ——Interface
⽅法1:HttpEntity getEntity()
获取此响应的消息实体(如果有的话)
⽅法2:StatusLine getStatusLine()
获取此响应的状态⾏。
Interface StatusLine :响应消息的第⼀⾏是状态⾏,由协议版本、数字状态代码及其相关的⽂本短语组成,每个元素由SP字符分隔。除⾮在最后的CRLF序列中,否则不允许使⽤CR或LF。
状态⾏= http版本的SP状态码SP原因短语CRLF——Interface
⽅法1:int getStatusCode()
我们接下来就要讲到HttpGet,HttpPost两个类中解决⽆参数和带参数的问题,和连接池技术问题
看如下博客,知道Get,Post请求的区别(也就是为什么我们要将HttpGet,HttpPost两个类)
2.1 HttpGet参数问题
访问传智官⽹,请求url地址(⽆参数)
以下代码默认已经对这些类有所了解,这⾥不再记叙有关类的信息
代码演⽰
public static void main(String[] args)throws Exception{
//1.创建对象
CloseableHttpClient httpClient = ateDefault();
//2.访问地址
HttpGet httpGet =new HttpGet("www.itcast");
//3.发起请求
CloseableHttpResponse response = ute(httpGet);
//4.解析响应酸洗工艺
StatusLine().getStatusCode()==200){
HttpEntity entity = Entity();
String content = String(entity,"utf8");
System.out.println(content);
}
//5.关闭response
response.close();
httpClient.close();
}
访问传智官⽹,搜索学习视频,请求url地址为(有参数)
有关API
public static void main(String[] args)throws Exception{
//1.创建对象
CloseableHttpClient httpClient = ateDefault();
//设置请求地址yun.itheima/search?keys=java
URIBuilder uriBuilder =new URIBuilder("yun.itheima/search");
uriBuilder.setParameter("keys","java");
//2.访问地址
HttpGet httpGet =new HttpGet(uriBuilder.build());
//3.发起请求
CloseableHttpResponse response = ute(httpGet);
//4.解析响应
StatusLine().getStatusCode()==200){
HttpEntity entity = Entity();
String content = String(entity,"utf8");
System.out.println(content);
}
//5.关闭response
response.close();
httpClient.close();
}
有关类的信息
Class URIBuilder:URI实例的⽣成器。
⽅法1:URIBuilder(URI uri)
从提供的URI构造⼀个实例。
⽅法2: URIBuilder setParameter(String param, String value)
设置URI查询的参数,如果设置则重写现有值。
⽅法3: URI build()
构建⼀个URI实例。
⼤家观察如上两个代码,发现基本思路都没变
1.创建对象
2.访问地址
3.发起请求
4.解析响应变得只是访问地址时要考虑有关的参数问题
2.2 HttpPost参数问题
使⽤Post访问创智官⽹,请求url地址(⽆参数)
public static void main(String[] args)throws Exception{
//1.创建对象
开学第一课观后感初一CloseableHttpClient httpClient = ateDefault();
//2.访问地址
HttpPost httpPost =new HttpPost("www.itcast");
//3.发起请求
CloseableHttpResponse response = ute(httpPost);
/
/4.解析响应
StatusLine().getStatusCode()==200){
HttpEntity entity = Entity();
String content = String(entity,"utf8");
System.out.println(content);
}
//5.关闭response
response.close();
httpClient.close();
}
带参数的Post请求
在创智中搜索学习视频,使⽤Post请求,url地址为
注意:url地址没有参数,参数keys=java,放到表单进⾏提交(和使⽤Get请求提交参数不⼀样,Get是url地址有参数,观察他们的代码就可以得出这个结论,前提要知道这些类有关的信息意思)
有关API
public static void main(String[] args)throws Exception{
//1.创建对象
CloseableHttpClient httpClient = ateDefault();
//2.访问地址yun.itheima/search?keys=java
HttpPost httpPost =new HttpPost("www.itcast/search");
//利⽤集合封装表单请求参数
List<NameValuePair> params =new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("keys","java"));
UrlEncodedFormEntity formEntity =new UrlEncodedFormEntity(params,"utf8");
httpPost.setEntity(formEntity);
//3.发起请求
CloseableHttpResponse response = ute(httpPost);
//4.解析响应
StatusLine().getStatusCode()==200){
HttpEntity entity = Entity();
String content = String(entity,"utf8");
System.out.println(content);
}
//5.关闭response
response.close();
httpClient.close();
}
2.3 连接池技术问题
如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使⽤连接池来解决这个问题。
代码演⽰
有关API

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。