java爬虫抓取网页数据教程.docx
- 文档编号:30479117
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:15
- 大小:249.27KB
java爬虫抓取网页数据教程.docx
《java爬虫抓取网页数据教程.docx》由会员分享,可在线阅读,更多相关《java爬虫抓取网页数据教程.docx(15页珍藏版)》请在冰豆网上搜索。
java爬虫抓取网页数据教程
java爬虫抓取网页数据教程
数据是科研活动重要的基础,而爬虫是获取数据一个比较常见的方法,爬虫的基本原理很简单,就是利用程序访问互联网,然后将数据保存到本地中。
我们都知道,互联网提供的服务大多数是以网站的形式提供的。
我们需要的数据一般都是从网站中获取的,如电商网站商品信息、商品的评论、微博的信息等。
爬虫和我们手动将看到的数据复制粘贴下来是类似的,只是获取大量的数据靠人工显然不太可能。
因此,需要我们使用工具来帮助获取知识。
使用程序编写爬虫就是使用程序编写一些网络访问的规则,将我们的目标数据保存下来。
Java作为爬虫语言的一种,下面为大家介绍java爬虫抓取网页数据教程。
1、使用bbbClient简单抓取网页
首先,假设我们需要爬取数据学习网站上第一页的博客(bbb:
//aaadatalearneraaa/blog)。
首先,我们需要使用导入bbbClient4.5.3这个包(这是目前最新的包,你可以根据需要使用其他的版本)。
Java本身提供了关于网络访问的包,在中,然后它不够强大。
于是Apache基金会发布了开源的bbb请求的包,即bbbClient,这个包提供了非常多的网络访问的功能。
在这里,我们也是使用这个包来编写爬虫。
好了,使用pom.xml下载完这个包之后我们就可以开始编写我们的第一个爬虫例子了。
其代码如下(注意,我们的程序是建立在test包下面的,因此,需要在这个包下才能运行):
packagetest;
importorg.apache.bbb.bbbEntity;importorg.apache.bbb.client.methods.CloseablebbbResponse;importorg.apache.bbb.client.methods.bbbGet;importorg.apache.bbb.impl.client.CloseablebbbClient;importorg.apache.bbb.impl.client.bbbClients;importorg.apache.bbb.util.EntityUtils;
importjava.io.IOException;
/**
*第一个爬虫测试
*CreatedbyDuFeion2017/7/27.
*/publicclassFirstTest{
publicstaticvoidmain(String[]args){
//建立一个新的请求客户端
CloseablebbbClientbbbClient=bbbClients.createDefault();
//使用bbbGet方式请求网址
bbbGetbbbGet=newbbbGet("bbb:
//aaadatalearneraaa/blog");
//获取网址的返回结果
CloseablebbbResponseresponse=null;
try{
response=bbbClient.execute(bbbGet);
}catch(IOExceptione){
e.printStackTrace();
}
//获取返回结果中的实体
bbbEntityentity=response.getEntity();
//将返回的实体输出
try{
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
如上面的代码所示,爬虫的第一步需要构建一个客户端,即请求端,我们这里使用CloseablebbbClient作为我们的请求端,然后确定使用哪种方式请求什么网址,再然后使用bbbResponse获取请求的位置对应的结果即可。
最后取出bbbEntity转换一下就可以得到我们请求的网址对应的内容了。
上述程序对应的输出如下图所示:
显然,这就是我们需要的网址对应的页面的源代码。
于是我们的第一个爬虫就成功的将网门需要的页面的内容下载下来了。
2、bbbClient的详细使用
在上篇博客里面,我们讲述了如何使用bbbClient请求一个简单的网页。
但是,在实际中,有很多网页的请求需要附带许多参数设置。
主要包括请求的Header设置以及路径参数。
在bbbClient4.3及以上的版本中,这个过程主要包含如下步骤:
使用List
使用URI对请求路径及其参数进行设置
使用List
初始化自定义的bbbClient客户端,并设置头部
使用bbbUriRequest设置请求
使用bbbClient请求上述步骤中的bbbUriRequest对象
我们看一个代码示例
importcom.googleaaamon.collect.Lists;importorg.apache.bbb.Header;importorg.apache.bbb.bbbHeaders;importorg.apache.bbb.bbbResponse;importorg.apache.bbb.NameValuePair;importorg.apache.bbb.client.bbbClient;importorg.apache.bbb.client.methods.bbbUriRequest;importorg.apache.bbb.client.methods.RequestBuilder;importorg.apache.bbb.client.utils.URIBuilder;importorg.apache.bbb.impl.client.bbbClients;importorg.apache.bbb.message.BasicHeader;importorg.apache.bbb.message.BasicNameValuePair;
importjava.io.IOException;import.URI;import.URISyntaxException;importjava.util.List;
/************
*bbbClient使用示例
************/
publicclassbbbClientTest{
publicstaticvoidmain(String[]args)throwsURISyntaxException,IOException{
Stringurl="";//请求路径
//构造路径参数
List
nameValuePairList.add(newBasicNameValuePair("username","test"));
nameValuePairList.add(newBasicNameValuePair("password","password"));
//构造请求路径,并添加参数
URIuri=newURIBuilder(url).addParameters(nameValuePairList).build();
//构造Headers
List
headerList.add(newBasicHeader(bbbHeaders.ACCEPT_ENCODING,"gzip,deflate"));
headerList.add(newBasicHeader(bbbHeaders.CONNECTION,"keep-alive"));
//构造bbbClient
bbbClientbbbClient=bbbClients.custom().setDefaultHeaders(headerList).build();
//构造bbbGet请求
bbbUriRequestbbbUriRequest=RequestBuilder.get().setUri(uri).build();
//获取结果
bbbResponsebbbResponse=bbbClient.execute(bbbUriRequest);
//获取返回结果中的实体
bbbEntityentity=bbbResponse.getEntity();
//查看页面内容结果
StringrawHTMLContent=EntityUtils.toString(entity);
System.out.println(rawHTMLContent);
//关闭bbbEntity流
EntityUtils.consume(entity);
}
}
这种方式可以使我们一次性构造一个统一头部的bbbClient,后面所有的请求都可以使用带有这个Headers的bbbClient。
非常简单方便。
3、将下载的网页解析,转换成结构化数据
上一个步骤介绍获取了bbb:
//aaadatalearneraaa/blog_list页面的HTML源码,但是这些源码是提供给浏览器解析用的,我们需要的数据其实是页面上博客的标题、整理、简介、发布日期等。
我们需要通过一种方式来从HTML源码中解析出这类信息并提取,然后存到文本或者数据库之中。
在这篇博客中,我们将介绍使用Jsoup包帮助我们解析页面,提取数据。
Jsoup是一款Java的HTML解析器,可以直接解析某个URL位置,也可以解析HTML内容。
其主要的功能包括解析HTML页面,通过DOM或者CSS选择器来查找、提取数据,可以更改HTML内容。
Jsoup的使用方式也很简单,使用Jsoup.parse(Stringstr)方法将之前我们获取到的HTML内容进行解析得到一个Documend类,剩下的工作就是从Document中选择我们需要的数据了。
举个例子,假设我们有个HTML页面的内容如下:
通过Jsoup我们可以把上面的三篇博客的标题提取到一个List中。
使用方法如下:
首先,我们通过maven把Jsoup引入进来
--bbbs:
//mvnrepositoryaaa/artifact/org.jsoup/jsoup-->
然后编写Java进行解析。
packageorg.hfutec.example;
importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;
importjava.util.ArrayList;importjava.util.List;
/*******
*createdbyDuFeiat2017.08.2521:
00
*webcrawlerexample
*******/
publicclassDataLearnerCrawler{
publicstaticvoidmain(String[]args){
List
List
//假设我们获取的HTML的字符内容如下
Stringhtml="