手拉手Java爬虫HttpClient

2024-03-23 02:36

本文主要是介绍手拉手Java爬虫HttpClient,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JAVA爬虫

HttpClient

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

使用 HttpClient 的 6 个步骤
1. 创建 HttpClient 的实例
2. 创建某种连接方法的实例,选择get或post请求
3. 确定是否有参数
4. 执行请求,并获得 response响应,然后获得HttpEntity对象
5. 释放连接。无论执行方法是否成功,都必须释放连接
6. 对得到后的内容进行处理

Pom.xml添加依赖

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>

GET请求

不带参

public static void main(String[] args) {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建HttpGet对象,设置url
HttpGet httpGet =new HttpGet("https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#auto/zh/");
System.out.println("发起请求信息:"+httpGet);CloseableHttpResponse response = null;
try {
//创建HttpClient发起请求,获取response
response = httpClient.execute(httpGet);
//解析响应
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println(content);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭response
try {
response.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//关闭httpClient
try {
httpClient.close();
} catch (IOException e) {
throw new RuntimeException(e);
}}
}

带参

public static void main(String[] args) throws Exception {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//设置带参的url地址http://yun.itheima.com/search?keys=java
URIBuilder uriBuilder =new URIBuilder("http://yun.itheima.com/search");
uriBuilder.setParameter("keys","java");//创建HttpGet对象,设置url
HttpGet httpGet =new HttpGet(uriBuilder.build());
System.out.println("发起请求信息:"+httpGet);CloseableHttpResponse response = null;
try {
//创建HttpClient发起请求,获取response
response = httpClient.execute(httpGet);
//解析响应
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println(content);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭response
try {
response.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//关闭httpClient
try {
httpClient.close();
} catch (IOException e) {
throw new RuntimeException(e);
}}
}

POST请求

不带参

public static void main(String[] args) {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建httpPost对象,设置url
HttpPost httpPost = new HttpPost("https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#auto/zh/");
System.out.println("发起请求信息:"+httpPost);CloseableHttpResponse response = null;
try {
//创建HttpClient发起请求,获取response
response = httpClient.execute(httpPost);
//解析响应
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println(content);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭response
try {
response.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//关闭httpClient
try {
httpClient.close();
} catch (IOException e) {
throw new RuntimeException(e);
}}
}


 

带参

public static void main(String[] args) throws UnsupportedEncodingException {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建httpPost对象,设置url
HttpPost httpPost = new HttpPost("http://yun.itheima.com/search");
System.out.println("发起请求信息:"+httpPost);
//声明list集合,封装表单中的参数
List<NameValuePair> params =new ArrayList<NameValuePair>();
//设置带参的url地址http://yun.itheima.com/search?keys=java
params.add(new BasicNameValuePair("keys","java"));
//创建表单的Entity对象
UrlEncodedFormEntity formEntity =new UrlEncodedFormEntity(params,"utf8");
//设置表单的Entity对象到Post请求中
httpPost.setEntity(formEntity);CloseableHttpResponse response = null;
try {
//创建HttpClient发起请求,获取response
response = httpClient.execute(httpPost);
//解析响应
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println(content);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭response
try {
response.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//关闭httpClient
try {
httpClient.close();
} catch (IOException e) {
throw new RuntimeException(e);
}}
}

连接池

public static void main(String[] args) {
PoolingHttpClientConnectionManager cm =new PoolingHttpClientConnectionManager();
//设置连接数
cm.setMaxTotal(100);
//设置没个主机的最大连接数
cm.setDefaultMaxPerRoute(10);doGet(cm);
}private static void doGet(PoolingHttpClientConnectionManager cm) {
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
HttpGet httpGet =new HttpGet("https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#auto/zh/");
CloseableHttpResponse response =null;
try {
response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(), "utf8");
System.out.println(content.length());
}}catch (IOException e){
e.printStackTrace();
}finally {
//关闭response
try {
response.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//关闭httpClient
try {
httpClient.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

连接请求配置

配置请求信息
//setConnectTimeout创建连接的最长时间,毫秒 、setConnectionRequestTimeout获取连接的最长

时间,毫秒
RequestConfig config =RequestConfig.custom().setConnectTimeout(1000).setConnectionRequestTimeout(1000).build();httpGet.setConfig(config);

Jsoup解析

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

jsoup的主要功能如下:“1.从一个URL,文件或字符串中解析HTML;2.使用DOM或CSS选择器来查找、取出数据;3.可操作HTML元素、属性、I文木;

maven加入依赖

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>

Jsoup解析Url

@Test
public void JUrl()throws Exception{
//解析url地址,参数1:要访问的url,参数2:访问超时时间
Document doc = Jsoup.parse(new URL("https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#zh/en/"), 100000);
//使用标签选择器
String text = doc.getElementsByTag("title").first().text();
System.out.println(text);
}

Jsoup解析文件

//解析文件
 

Document doc = Jsoup.parse(new File("F:\\front\\code\\vue01\\比较数字大小.html"),"utf8");
String text = doc.getElementsByTag("title").first().text();
System.out.println(text);

Dom方式获取元素

元素获取

1.根据d查询元素 getElementByld

2.根据标签获取元素 getElementsByTag

3.根据 class i获取元素 getElementsByClass

4.根据属性获取元素 getElementsByAttribute

@Test
public void DOMGet()throws Exception{
//解析文件
Document doc = Jsoup.parse(new File("F:\\front\\code\\vue01\\dom与diff算法.html"),"utf8");
//1.根据d查询元素 getElementById
Element elementById = doc.getElementById("101");
System.out.println("获取到文件内容:"+elementById.text());
//2.根据标签获取元素 getElementsByTag
Element th = doc.getElementsByTag("th").first();
System.out.println("获取到文件内容:"+th.text());
//3.根据 class i获取元素 getElementsByClass
Elements abc = doc.getElementsByClass("abc");
System.out.println("获取到文件内容:"+abc.text());
//4.根据属性获取元素 getElementsByAttribute
Elements id = doc.getElementsByAttribute("id");
System.out.println(id.text());
Elements id1 = doc.getElementsByAttributeValue("id", "101");
System.out.println(id1.text());
}

这篇关于手拉手Java爬虫HttpClient的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836870

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定