java 网络爬虫_如何用Java实现网络爬虫

原标题:如何用Java实现网络爬虫

6af635ce86cb2e54c9b048dd517348f1.png

微信公众号“书圈”后台回复【Javapachong1】,下载本例的PPT和源码

作品描述

本章作品是一个能够抓取指定网站ACM比赛信息的爬虫。ACM程序设计大赛是一项国际型的比赛,有很多训练编程能力的网站可供ACM队员使用,网页上的用户信息可以衡量一个ACM队员的水平。为了简化设计,本章作品以获取一个指定用户的信息为例。多个用户与多个比赛的信息获取见本章的实验拓展。

作品功能演示如下:

打开chap12目录下的begin子文件夹,会看到里面包含一个jar文件,如图12.1所示,Spider.jar是爬虫程序。

c4f30a1fca5c7a363662aa05e96c4ae0.png

图12.1 Chap12的begin目录

首先在文件夹地址栏输入cmd,打开控制台程序,在配置好JDK环境变量的前提下,输入“java –jar Spider.jar”运行爬虫程序,根据页面上的用户信息与比赛信息,获取必要的信息与数据,并进行整合,处理结果如图12.2所示。

c104b87a27f38e68ad84595a10723a56.png

图12.2 爬虫程序运行结果

其中一个资源是获取杭州电子科技大学ACM训练系统(简称HDU)的用户信息,根据用户名,获取用户的详细信息,如图12.3所示。

3a39fdb4afc055f5e66873dad138b94b.png

图12.3HDU用户信息

另一个资源是获取杭州电子科技大学ACM训练系统的比赛信息,根据比赛的ID号和比赛密码,获取比赛排行榜资源,如图12.4所示。

9cc8326b9a996b59464810fd5d67c859.png

图12.4HDU比赛信息

最后一个资源是获取虚拟评测系统(简称Vjudge)的用户信息,根据用户名,获取用户详细信息数据,该页面中的用户数据是JSON字符串,信息如图12.5所示。

3f6b333548fd5166a9311b1cc43bdede.png

图12.5Vjudge用户信息

知识介绍

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。网络爬虫可以模拟浏览器的功能,把URL作为HTTP请求的内容发送到服务器端,然后读取服务器端的响应资源。

Java语言是为网络而生的编程语言,它把网络资源看成是一种文件,它对网络资源的访问和对本地文件的访问一样方便。它把请求和响应封装为流,因此人们可以根据响应内容,获取响应流,之后从流中按字节读取数据。

例如,java.net.URL类可以对指定的URL发送Web请求并获取响应文档。用法如下:

URL pageUrl =new URL(path);

根据URL对象,获取网络流,这样就可以像访问本地文件一样访问网络资源:

InputStreaminStream = pageUrl.openStream();

用Java语言编写网络爬虫有两种常见方法:一种是用java.net包定义的URL、HttpURLConnection等基于HTTP的访问类;另一种是用Apache的HTTP客户端开源项目—HttpClient。HttpClient可以很好地处理HTTP连接中的各种问题,操作起来非常方便,开发效率高,健壮性好。

HttpClient主要用法总结如下。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

//创建一个客户端,相当于打开一个浏览器

HttpClient httpClient = HttpClientBuilder.create().build();

//创造一个GET方法,类似于在浏览器地址栏输入一个地址

HttpGet httpGet = new HttpGet("http://acm.hdu.edu.cn/");

//发送请求并获取响应对象,相当于浏览器回车访问

HttpResponse response = httpClient.execute(httpGet);

//获取响应状态码

int statusCode = response.getStatusLine().getStatusCode();

//获取消息实体,内容是HTTP传送的报文

HttpEntity resEntity = response.getEntity();

//查看网页内容,能查看的信息还有很多,如head等

System.out.println(EntityUtils.toString(resEntity, "UTF-8"));

//释放资源

httpGet.abort();

第02行表示创建一个客户端,相当于打开一个浏览器。第04行使用GET方法对http://acm.hdu.edu.cn/进行请求。第06行执行Web请求,并获取响应对象,响应对象包括响应头部和响应体。第08行获取响应状态。第10行是消息实体,其中的内容是HTTP传送的报文,例如报文头部、HTML源代码等。第12行查看获取到的网页的HTML源代码,这也是网页抓取中所需要的,在示例中仅仅打印到了控制台中,而在实际项目中,常常写入到文件或数据库中。最后关闭网络链接,释放资源,以免造成资源消耗。

上述示例使用GET请求获取Web资源,也可以使用POST请求获取的Web资源。GET请求与POST请求的方式不同,GET请求常用于信息的获取,而POST请求常用于信息的提交。例如:

//创建一个POST请求

HttpPost httPost= new HttpPost("http://acm.hdu.edu.cn/");

简单的网页抓取实例

本节根据之前所讲的内容,编写一个实例来更好地理解如何实现对网页进行抓取。该实例的程序如程序12.1所示。

程序12.1 Spider项目的自定义爬虫类GetHduHome.java

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

public class GetHduHome {

public void loadPage(String path) throws ClientProtocolException,

IOException {

//创建客户端

HttpClient httpClient = HttpClientBuilder.create().build();

HttpGet httpGet = new HttpGet(path);

String fileName = "C:/HduHomePage.html";

OutputStream fout = null;

//获取页面请求对象

HttpResponse response = httpClient.execute(httpGet);

int statusCode = response.getStatusLine().getStatusCode();

//对状态码进行处理(简单起见,只处理状态码为200的数据)

if (statusCode == HttpStatus.SC_OK) {

HttpEntity resEntity = response.getEntity();

//获取页面HTML数据

byte[] pageContent = EntityUtils.toByteArray(resEntity);

//写入到文件

fout = new FileOutputStream(fileName);

fout.write(pageContent);

}

if (fout != null)

fout.close();

httpGet.abort();

}

//测试源代码

public static void main(String[] args) throws ClientProtocolException,

IOException {

//抓取" http://acm.hdu.edu.cn/"页面

GetHduHome hduUser = new GetHduHome();

String path = "http://acm.hdu.edu.cn/";

hduUser.loadPage(path);

}

}

程序12.1抓取的是杭州电子科技大学ACM训练系统首页,查看保存的页面文件,就可以看到抓取的网页信息,如图12.6所示。

1835e2b98ced2f0193d0e8859c058d8d.png

图12.6HDU首页资源

程序12.1是一个比较简单的抓取页面实例。,由于互联网的复杂性,抓取网页时需要考虑的因素有很多,例如资源类型问题、状态码问题等。

责任编辑:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值