天天看点

Java爬虫-使用HttpClient+Jsoup实现简单的爬虫爬取文本

##一、工具介绍

  HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

HttpClient下载地址:http://hc.apache.org/downloads.cgi

  Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup下载地址:https://jsoup.org/download

##二、使用方法

1.HttpClient的使用步骤:

(1) 创建HttpClient对象;

(2) 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象;

(3) 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数;

(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse;

(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容;

(6) 释放连接。无论执行方法是否成功,都必须释放连接;

2.Jsoup的常用方法(Jsoup很强大,我只列出来一部分):

| 类| 方法 | 作用

| :--------- ?:-------------? :-----?

| Connection |connect(String url)|根据给定的url(必须是http或https)来创建连接 |

| Connection | cookie(String name, String value) | 发送请求时放置cookie |

| Connection | userAgent(String userAgent) | 发送请求时设置User-Agent |

| Connection | header(String name, String value) | 发送请求时添加请求头 |

| Connection | data(Object data) | 发送请求时传递请求参数,Object为Map或String |

| Connection | get() | 以get方式发送请求并对返回结果进行解析 |

| Connection | post() | 以post方式发送请求并对返回结果进行解析 |

| Document |parse(…)| |

| Document |parseBodyFragment(…)| |

| Document |getElementById(String id)| 根据id获得元素|

| Document |getElementsByTag(String tag) | 根据标签获得元素|

| Document |getElementsByClass(String className)| 根据class获得元素 |

| Document |getElementsByAttribute(String key)| 根据属性获得元素|

| Document |select(String key)| 用jquery/css选择器获得元素|

| Element|attr(String key)| 获得元素的数据|

| Element|attr(String key, String value) |设置元素数据|

| Element|text()|获得文本值

| Element|text(String value)| 设置文本值

| Element|html() |获取html

| Element|html(String value)|设置html

| Element|data()|获得数据内容

##三、实例

  列了这么多,现在我们开始实例部分。我们要获取网站的指定文本信息,与获取网站全部链接是一样的,我们先来看看获取全部链接的代码。

  首先我们先用只用Jsoup来获取网站全部有用的链接:

package com.httpclient;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MyJsoup {

	/**
	 * 需求:使用Jsoup解析网页源码
	 * @author ouyang
	 * @since 20180630
	 * @param args
	 */
	public static void main(String[] args) {
		
		String url = "http://www.xaufe.edu.cn";
		
		//使用Jsoup向http://www.xaufe.edu.cn/发送请求
		Document doc = null;
		try {
			doc = Jsoup.connect(url)
					.userAgent("Mozilla")
					.cookie("auth", "token")
					.timeout(3000)
					.get();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//Jsoup使用类型css,jquery选择器的方式获取元素节点
		Elements elements = doc.select("#top2_23 a");
		
		for(Element element : elements ) {
			System.out.println(element.text() + ": " + url+element.attr("href"));
		}
		
	}
	
}

           

  HttpClient+Jsoup获取网站的全部有用的链接,直接附上代码:

package com.httpclient;

import java.io.IOException;

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MyHttpClient {
	
	/**
	 * 需求:使用httpClient爬取网站数据
	 * @author ouyang
	 * @since 20180630
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			getTagA();
		} catch (ParseException | IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void getTagA() throws ParseException, IOException {
		//要爬取的网站
		String url = "http://www.xaufe.edu.cn";
		
		//创建HttpClient对象
		HttpClient httpClient = HttpClients.createDefault();
		
		//大部分爬虫url都是get请求,创建get请求对象
		HttpGet httpGet = new HttpGet(url);
		
		/*
		 * 设置响应时间,设置请求超时,设置代理服务器,
		 * 防止网站识别你是爬虫软件进而拉黑禁止访问
		 */
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(5000)  			//设置响应时间
				.setConnectionRequestTimeout(5000)  //设置请求超时
				.setProxy(new HttpHost("222.182.56.29", 8118))   //设置代理服务器(网上有)
				.build();
		httpGet.setConfig(requestConfig);
		
		//设置头信息,不然请求不到网页
        httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
        httpGet.setHeader("User-Agent", 
        		"Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");  
		
		
		//向http://www.xaufe.edu.cn/发起请求,获取网页信息
		String content = "";
		HttpResponse httpResponse = httpClient.execute(httpGet);
		content = EntityUtils.toString(httpResponse.getEntity(), "GB2312");
		
		//System.out.println(content);
		
		//加上用Jsoup解析网页
		Document doc = Jsoup.parse(content);
		
		//Jsoup使用类型css,jquery选择器的方式获取元素节点
		Elements elements = doc.select("a"); //获取页面上所有a标签
		
		for(Element element : elements ) {
			String target = element.text();
			String src = element.attr("href");
			if(target != null && !"".equals(target) && !"".equals(src)) {
				if(src.contains("http")) {
					System.out.println(target + ": " + src);
				} else {
					System.out.println(target + ": " + url+src);
				}
				
			}
			
		}
	}

}

           

##四、学有所思,欢迎大家评论留言

####1、怎么获取列表的数据,因为列表有分页?

####2、抓取的url是文件流(图片,视频),应该要怎样做处理?

####3、怎么时爬虫一直爬下去,其中怎么让爬取效率更高?

HttpClient详细解释:https://blog.csdn.net/zhuwukai/article/details/78644484

Jsoup常用方法功能介绍:https://blog.csdn.net/key_mql/article/details/55522325

继续阅读