JAVA爬虫之HttpClient入门演示

这篇博客介绍了如何使用HttpClient进行网页爬取和图片下载,包括设置User-Agent解决访问拦截问题,以及超时控制。作者强调了HttpClient在HTTP协议支持上的高效性和灵活性,并鼓励读者探索更多高级用法如多线程和定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpClient分享

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

1. 初识HttpClient 使用HttpClient爬取某网站

前置知识

  • Javaj基础
  • 网络知识基础

代码如下图:

	@Test
	public  void helloHttpClient() throws Exception {
		CloseableHttpClient httpClient=HttpClients.createDefault();
		String uri="https://www.tuicool.com/";
		HttpGet httpGet=new HttpGet(uri);
		CloseableHttpResponse response = httpClient.execute(httpGet);
		HttpEntity entity = response.getEntity();
		String entityStr = EntityUtils.toString(entity, DEFAULT_CHARASET);
		logger.info(entityStr);
		response.close();
		httpClient.close();
	}
爬取网页被拦截

被拦截.png

为什么呢?浏览器能正常访问

浏览器正常访问.png
浏览器正常访问关键.png

看到了请求头部分的User-Agent信息于是模仿浏览器
@Test
	/**
	 * 模拟浏览器访问
	 * 在HttpGet例设置请求头内容,通过kv的方式赋予浏览器的标示
	 * @throws Exception
	 */
	public  void analogBrowser() throws Exception {
		CloseableHttpClient httpClient=HttpClients.createDefault();
		String uri="https://www.tuicool.com/";
		HttpGet httpGet=new HttpGet(uri);
//		在HttpGet例设置请求头内容,通过kv的方式赋予浏览器的标示,当然也可以赋值为Android、iOS等客户端
		httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
		CloseableHttpResponse response = httpClient.execute(httpGet);
		HttpEntity entity = response.getEntity();
		logger.info("返回响应状态编码为[ {} ]",response.getStatusLine().getStatusCode());
		logger.info("返回内容编码类型为[ {} ]",entity.getContentType().getValue());
		String entityStr = EntityUtils.toString(entity, DEFAULT_CHARASET);
		logger.info(entityStr);
		response.close();
		httpClient.close();
	}
模仿浏览器后允许访问

模仿浏览器后允许访问.png

接下来我们搞点事情,为了以后从某站下载某些不可描述的资料做准备,下载一张图片
@Test
	/**
	 * 下载图片
	 * @throws Exception
	 */
	public  void dowloadPicture() throws Exception {
		CloseableHttpClient httpClient=HttpClients.createDefault();
		String uri="https://aimg2.tuicool.com/YnmA3y3.jpg!index";
		HttpGet httpGet=new HttpGet(uri);
//		在HttpGet例设置请求头内容,通过kv的方式赋予浏览器的标示,当然也可以赋值为Android、iOS等客户端
		httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
		CloseableHttpResponse response = httpClient.execute(httpGet);
		HttpEntity entity = response.getEntity();
		if(null!=entity) {
			logger.info("返回响应状态编码为[ {} ]",response.getStatusLine().getStatusCode());
			logger.info("返回内容编码类型为[ {} ]",entity.getContentType().getValue());
//			通过流的方式把图片
			InputStream inputStream = entity.getContent();
			FileUtils.copyToFile(inputStream, new File("/home/left/aaa.jpg"));
		}
		response.close();
		httpClient.close();
	}
控制台显示

下载图片控制台显示.png

图片下载成功

下载图片1.png

使用代理
	@Test
	/**
	 * 使用代理IP
	 * @throws Exception
	 */
	public  void helloProxyip() throws Exception {
		CloseableHttpClient httpClient=HttpClients.createDefault();
		String uri="http://www.i2finance.net/";
		HttpGet httpGet=new HttpGet(uri);
//		在HttpGet例设置请求头内容,通过kv的方式赋予浏览器的标示,当然也可以赋值为Android、iOS等客户端
		httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
		HttpHost proxy=new HttpHost("103.235.199.93", 49176);
		RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
		//		设置代理
		httpGet.setConfig(config);
		CloseableHttpResponse response = httpClient.execute(httpGet);
		HttpEntity entity = response.getEntity();
		if(null!=entity) {
			logger.info("此次为代理访问,代理信息为[{}]",httpGet.getConfig().getProxy());
			logger.info("返回响应状态编码为[ {} ]",response.getStatusLine().getStatusCode());
			logger.info("返回内容编码类型为[ {} ]",entity.getContentType().getValue());
		}
		response.close();
		httpClient.close();
	}

设置代理访问.png

关于超时,可以通过设置超时时间(单位毫秒)来判断是否该结束当前进行,避免空耗
public static void main(String[] args) throws Exception {
		CloseableHttpClient httpClient=HttpClients.createDefault();
		String uri="http://www.i2finance.net/";
		HttpGet httpGet=new HttpGet(uri);
//		在HttpGet例设置请求头内容,通过kv的方式赋予浏览器的标示,当然也可以赋值为Android、iOS等客户端
		httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
		RequestConfig config = RequestConfig.custom()
				.setConnectionRequestTimeout(100)
				.setSocketTimeout(10)
				.build();
		//		设置代理
		httpGet.setConfig(config);
		CloseableHttpResponse response = httpClient.execute(httpGet);
		HttpEntity entity = response.getEntity();
		if(null!=entity) {
			logger.info("此次为代理访问,代理信息为[{}]",httpGet.getConfig().getProxy());
			logger.info("返回响应状态编码为[ {} ]",response.getStatusLine().getStatusCode());
			logger.info("返回内容编码类型为[ {} ]",entity.getContentType().getValue());
		}
		response.close();
		httpClient.close();
	}
未超时

未超时.png

超时

超时.png

读超时.png

鄙人入行时短,才疏学浅,感谢大家花费时间听我听我叨叨HttpClient入门这点知识,较为浅显,更多的小技巧,如配合多线程和定时任务,有待挖掘。还希望各位同事多多指点,共同进步。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值