##一、工具介绍
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