首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有什么方法可以在Jsoup中使用连接池吗?

在Jsoup中,可以通过使用连接池来提高爬取网页的效率和性能。连接池可以重复使用已经建立好的网络连接,避免频繁地创建和关闭连接,从而减少资源消耗和网络延迟。

要在Jsoup中使用连接池,可以借助第三方库如Apache HttpClient来实现。下面是一种实现方式:

  1. 导入所需的依赖:
代码语言:txt
复制
<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
</dependencies>
  1. 创建连接池管理器:
代码语言:txt
复制
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.NoConnectionReuseStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;

public class JsoupConnectionPoolManager {

    private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 200; // 最大连接数
    private static final int DEFAULT_MAX_PER_ROUTE_CONNECTIONS = 20; // 每个路由的最大连接数
    private static final int DEFAULT_CONNECT_TIMEOUT = 5000; // 连接超时时间
    private static final int DEFAULT_READ_TIMEOUT = 10000; // 读取超时时间

    private PoolingHttpClientConnectionManager connectionManager;
    private CloseableHttpClient httpClient;

    public JsoupConnectionPoolManager() {
        ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
        LayeredConnectionSocketFactory sslsf = null;
        try {
            sslsf = new SSLConnectionSocketFactory(SSLContextBuilder.create().loadTrustMaterial(new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
        } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
            e.printStackTrace();
        }

        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", plainsf)
                .register("https", sslsf)
                .build();

        connectionManager = new PoolingHttpClientConnectionManager(registry);
        connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
        connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE_CONNECTIONS);
        connectionManager.setValidateAfterInactivity(1000);

        ConnectionConfig connectionConfig = ConnectionConfig.custom()
                .setCharset(StandardCharsets.UTF_8)
                .build();
        connectionManager.setDefaultConnectionConfig(connectionConfig);

        RequestConfig defaultRequestConfig = RequestConfig.custom()
                .setConnectTimeout(DEFAULT_CONNECT_TIMEOUT)
                .setSocketTimeout(DEFAULT_READ_TIMEOUT)
                .setConnectionRequestTimeout(DEFAULT_CONNECT_TIMEOUT)
                .build();

        httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setConnectionManagerShared(true)
                .evictIdleConnections(60, TimeUnit.SECONDS)
                .evictExpiredConnections()
                .setConnectionTimeToLive(60, TimeUnit.SECONDS)
                .setDefaultRequestConfig(defaultRequestConfig)
                .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
                .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true))
                .build();
    }

    public CloseableHttpClient getHttpClient() {
        return httpClient;
    }

}
  1. 使用连接池进行网络请求:
代码语言:txt
复制
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        String url = "https://example.com";
        JsoupConnectionPoolManager connectionPoolManager = new JsoupConnectionPoolManager();
        try {
            Document doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36")
                    .timeout(5000)
                    .get();
            System.out.println(doc.title());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上代码示例中,通过JsoupConnectionPoolManager创建了一个连接池管理器,并通过getHttpClient()方法获取了一个可重用的HttpClient实例。然后可以使用Jsoup.connect(url)来构建Jsoup连接,并在连接上设置一些参数(如User-Agent、超时时间等)。最后调用.get()方法来获取网页内容。

使用连接池可以提高爬取网页的效率和性能,同时也能避免对目标网站产生过大的访问压力。在使用连接池时,需要注意合理配置连接池的最大连接数和每个路由的最大连接数,以及适当设置超时时间等参数,根据实际情况调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

推荐系统,我还有隐私?联邦学习:你可以

(3) 隐式反馈情况下,值 r_ui=0 可以多种解释,例如用户 u 对 item i 不感兴趣,或者用户 u 可能不知道 item i 的存在等等。...然后,每个客户端使用公式(7)更新 x_ u 得到(x_ u)*。可以针对每个用户 u 独立地更新,而不需要参考任何其他用户的数据。...为了解决这一问题,本文提出了一种随机梯度下降方法,允许中央服务器更新 y_i,同时保护用户的隐私。具体的,使用下式中央服务器更新 y_i: ?...所有视图都可以访问共享数据集 I。对于联邦学习推荐系统任务,假设老用户一些可以生成行为数据 y,而新用户没有任何行为数据。...Fed-NewsRec 是专门为新闻推荐构建的方法,其中使用的新闻模型、用户模型都仅限于该领域。第四节,我们进一步分析了一个普适的基于内容的联邦多视图推荐框架 FL-MV-DSSM。

4.6K41
  • 什么方法可以快速筛选出 pitch 的值 0.2 > x > -0.2 的值?

    一、前言 前几天Python钻石交流群个叫【进击的python】的粉丝问了一个Python基础的问题,这里拿出来给大家分享下,一起学习下。...他的数据如下图所示: 什么方法可以快速筛选出 pitch 的值 0.2 > x > -0.2 的值呢?...二、解决过程 这个问题肯定是要涉及到Pandas取数的问题了,从一列数据取出满足某一条件的数据,使用筛选功能。 他自己写了一个代码,如下所示: 虽然写的很长,起码功能是实现了的。...也是可以实现这个需求的。 后来他自己对照着修改了下,完全可行。 其实有空格的话,也是可以直接引用过来的,问题不大。

    1.2K20

    VB.net,数据去重什么方法

    VB.net,数据去重什么方法 方法1:使用HashSet(适用于.NET Framework 3.5及以上版本) ' 假设我们一个ArrayList,但我们将其转换为List(Of T...2:使用Linq(适用于.NET Framework 3.5及以上版本) ' 假设我们一个ArrayList,我们可以直接转换并使用Linq的Distinct方法 Dim arraylist As...3:用字典对数据去重在VB.NET,你可以使用`Dictionary`类(.NET Framework和.NET Core)来去除重复的数据。...或VB.netSplit()与Replace()的用法 2 VB.net,List(of string())与List(of List(of string))什么区别 3 VB.net,List...什么方法与属性 4 VB.net,Stopwatch什么属性与方法 5 VB.net的多线程System.Threading 6 VB.NET,多线程的学习笔记(一) 7 VB.netListbox

    23010

    什么静态方法不能使用this

    JVM的运行时数据区中有个虚拟机栈(或Java栈),它的里面是由栈帧'叠加'而成.栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成. 那么我们就从局部变量表角度解答下这个问题....下面是测试代码,一个静态方法query,一个普通方法shadow,这两个方法的参数和函数体完全一样. // 静态方法 public static void query(String year) {...int month = 12; String address = "Jiangsu"; System.out.println(address); } // 普通方法 public void...query方法的局部变量表,如下 shadow方法的局部变量表,如下 我们发现,非静态方法shadow的局部变量表中有this,而在静态方法query的局部变量表没有this....普通方法,它的局部变量表的第一个槽存放了this, 而静态方法的局部变量表没有存放this.

    1.9K30

    数据分析可以使用什么方法 数据分析什么应用场景

    数据分析是一种通过数据对整理,结合,并对数据背后所反映的情况进行归纳总结的一种方法。那么在这其中分析相关数据常见于专业人士的使用和统计,对于普通人来说依然存在不少疑惑。...image.png 数据分析可以通过什么方法进行分析 数据分析是一种常见运用于各个企业,个体户之中的一种分析方法。通过数据的整合来进行现象分析。常见的分析相关数据的方法主要有一下几种: 人工分析。...系统分析是一种较为简便的分析相关数据方法,通过建立分析相关数据的程序,提供数据蓝本,然后软件就会根据使用者提供的蓝本自行收集信息并加以分析,其优点在于效率高,处理速度快。...数据分析什么应用场景 数据分析可以应用于所有需要分析相关数据的场所,小到菜贩子的销售额,大到国家之间的贸易,这种分析方法都是可以让人们更好地了解并统计当下发生的事情并对事情的发展作出判断。...综上所述,数据分析是一种用于进行数据统计和数据归纳整理以反映背后所代表的意义的统计方法。而不同的分析方法各有优劣,至于如何选择两者,则需要使用者结合自身应用场景来进行判断了。

    1.3K40

    VB.net,一维数组排序什么方法

    VB.NET,你可以使用多种方法对一维数组进行排序。 以下是一些常见的方法: 1.使用Array类的Sort方法 Array.Sort 方法是最简单且直接的方式。...T)的Sort方法 如果你希望保持原始数组的顺序,或者想要进行更复杂的排序(例如自定义比较器),那么可以将数组转换为 List(Of T),然后使用 List(Of T) 的 Sort 方法。...你可以使用 OrderBy 方法对数组进行排序,并得到一个新的排序后的数组。...of string))什么区别 3 VB.net,List什么方法与属性 4 VB.net,Stopwatch什么属性与方法 5 VB.net的多线程System.Threading 6 VB.NET...,多线程的学习笔记(一) 7 VB.netListbox 8 VB.net,数据去重什么方法

    28210

    如何快速掌握一门新技术,什么独特的学习方法和技巧可以分享

    今日话题:如何快速掌握一门新技术,什么独特的学习方法和技巧可以分享?图片这个话题引起了我的思考和总结,现在的技术这么多,我们该如何高效的学习呢?我先总结一下我所了解的技术和学习的路径。...flask、pandas、paddle系列shell脚本中间件elasticsearchrediskafkaDocker + jenkins……发现即使列举一个清单也完全不能列举完全,因为技术更新的太快了,很多也用不上了...针对这么多的技术,我也总结了我学习过程的技巧。快速学习技巧学习目标的确立在学习一门新技术之前,可以先确定自己学习的目标,为什么要去学,要学到什么程度。如为了更高的薪资、为了学习技术。...可以跟着视频教程做项目,也可以根据实际的问题开发出对应的代码。如:shigen上次就使用python开发了一个控制台阅读Excel文件内容的工具。...以上就是shigen对于如何快速掌握一门新技术,你什么独特的学习方法和技巧可以分享?的经验总结和分享了。与shigen一起,每天不一样!

    23820

    C#IsNullOrEmpty和IsNullOrWhiteSpace的使用方法什么区别?

    前言 今天我们将探讨C#两个常用的字符串处理方法:IsNullOrEmpty和IsNullOrWhiteSpace。这两个方法处理字符串时非常常见,但是它们之间存在一些细微的区别。...本文中,我们将详细解释这两个方法的功能和使用场景,并帮助您更好地理解它们之间的区别。 IsNullOrEmpty 作用 该方法用于检查字符串是否为null或空字符串("")。...这个方法只关注字符串的长度,不考虑其中的空白字符。...IsStringNullOrEmpty(string str)     {         return string.IsNullOrEmpty(str);     } IsNullOrWhiteSpace 作用 该方法用于检查字符串是否为...与IsNullOrEmpty不同,IsNullOrWhiteSpace会考虑字符串的空白字符。

    33520

    vue源码分析之defineReactive方法什么两种dep收集依赖?

    了解vue响应式原理对童鞋,想必对defineReactive方法印象,这是vue响应式的核心方法。...shallow && observe(newVal); dep.notify(); }, }); } 复制代码 但是从上面的defineReactive方法可以看到,除了obj...令人一头雾水的是,reactiveSetter方法,只有闭包的dep通知watcher, childOb.dep并没有通知watcher,而且这个dep也没必要通知watcher。...那 childOb.dep的作用是什么?这里先说作用,是给Vue.set()方法用的。如果还不清楚Vue.set方法的童鞋,建议先了解Vue.set的原理。...我们先看看childOb是什么 从下面代码可以知道,childOb是Observer的实例,constructor给childOb添加了dep属性 export class Observer {

    1.8K00

    爬虫入门(Java)

    网络爬虫 网络爬虫是什么?是一种按照一定规则,自动抓取网页信息的脚本。对于获取公开数据,是一个效率很高的工具。本篇文章先介绍HttpClient,Jsoup这两个开源工具。...环境准备 jdk1.8 Intellij IDEA maven 入门小Demo 创建maven工程,并导入坐标,坐标可以https://mvnrepository.com/查找 <dependencies...HttpClient相当于一个浏览器,平时我们请求完链接后,并不需要关闭浏览器,相当于数据库操作,没不需要每次都关闭,数据库连接池的概念,那么HttpClient工具也是有这个概念的。...("title").first().text(); System.out.println(title);//CSDN-专业IT技术社区 } } 我们可以看见,jsoup可以直接获取网页信息的...,跟HttpClient类似,那我们为什么还要使用HttpClient呢?

    1.4K20

    海外http代理的api代理是什么意思?使用方法哪些?

    ip代理互联网工作是常见的,而apiip代理是ip代理的一种类型,使用时需要生成api链接。在这篇文章,我将详细介绍api是什么,api代理又是什么,并且提供使用api代理的方法和步骤。...首先,什么是api?我们日常使用互联网的过程,经常需要在多个软件组件之间来回跳跃,而支撑我们完成这一行为的正是api接口。...api代理就是使用api的过程,通过ip代理来访问目标网站或服务。api代理常用于爬虫、数据挖掘、网站监测、广告投放等场景可以帮助用户高效地获取所需数据,保护隐私并提高数据安全性。...这样一来,你就能获得大量的ip和端口,然后就可以开始使用了。你可以将api接口复制到浏览器栏,回车后会返回大量的ip和端口,然后你就可以将它们用于你的需求。...另外,你还可以将api接口对接到软件,这样软件就可以自动获取ip代理并自动切换到使用ip代理。同时,你也可以将api接口对接到程序代码,这样就能实现全自动化工作。

    53300

    Oracle,LogMiner是什么?其哪些用途?请简述LogMiner的使用过程。

    题目部分 Oracle,LogMiner是什么?其哪些用途?请简述LogMiner的使用过程。...使用该工具可以轻松获得Redo日志文件(包含归档日志文件)的具体内容。特别是该工具可以分析出所有对于数据库的DML操作(INSERT、UPDATE、DELETE等)语句。...确保创建Flat File文件的过程,不能有DDL操作被执行。...③ 使用Online Catalog(联机日志) 为了使LogMiner直接使用数据库当前使用的字典,开始LogMiner时可以指定将联机目录作为字典源: SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR...如果源字典是Flat File字典或Redo日志的字典,则可以使用DDL_DICT_TRACKING参数来跟踪DDL语句。DDL跟踪默认是关闭的。

    47610

    Oracle,若临时表空间使用率过高什么调优思路?

    ♣ 题目部分 Oracle,若临时表空间使用率过高什么调优思路?...当SQL语句中使用了诸如ORDER BY、GROUP BY子句时,Oracle服务器就需要对所选取的数据进行排序,这时如果排序的数据量很大,那么内存的排序区(PGA)就可能装不下,所以,Oracle...临时表空间中的排序段是实例启动后当第一个排序操作时创建的,排序段需要时可以通过分配EXTENTS来扩展并一直可以扩展到大于或等于该实例上所运行的所有排序活动的总和。...若临时表空间占用过大,首先,要去检查是什么会话占用了临时表空间,具体占用了多少,临时段的具体类型是什么。...以上例子,TEMP表空间的TS#为3,所以TS#+1=4。如果想清除所有表空间的临时段,那么TS#设置为2147483647。

    2.1K30

    【DB笔试面试634】Oracle什么是直方图(Histogram)?直方图的使用场合哪些?

    ♣ 题目部分 Oracle什么是直方图(Histogram)?直方图的使用场合哪些? ♣ 答案部分 直方图是CBO的一个重点,也是一个难点部分,面试中常常被问到。...但是,目标列的数据是均匀分布这个原则并不总是正确的,实际的生产系统很多表的列的数据分布是不均匀的,甚至是极度倾斜、分布极度不均衡的。...当数据分布倾斜时,直方图可以有效地提升Cardinality评估的准确度。构造直方图最主要的原因就是帮助优化器数据严重偏斜时做出更好的规划。...创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时应该根据WHERE子句中的值返回表80%的记录。...如优化器对中间结果集的大小作出不正确的判断,则它可能会选择一种未达到最优化的表连接方法。因此向该列添加直方图经常会向优化器提供使用最佳连接方法所需的信息。

    1.5K50

    如何使用Java进行网络爬虫

    愿你不再关心溢出与异常== @[toc] 好了废话不多说,我们先来看看用Java爬虫需要先准备什么?...如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使用连接池来解决这个问题。...jsoup的主要功能如下: 1.从一个URL,文件或字符串解析HTML; 2.使用DOM或CSS选择器来查找、取出数据; 3.可操作HTML元素、属性、文本; <!...Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup...仅仅作为Html解析工具使用 ==写到最后了,希望大家对大家有所帮助,谢谢 感悟:开始写博客,希望自己可以坚持下去, 至少每周一篇,积少成多,并且保证质量,希望大家多多支持,同时也是自己的一个积累的过程

    38530
    领券