Android使用skrape.it发起HTTP请求耗时过长问题求助
问题分析与解决方案
你的核心问题是skrape.it的AsyncFetcher发起HTTP请求耗时远超cURL,且必须设置2分钟以上超时才能避免报错,这大概率是因为skrape.it默认的Ktor客户端配置偏保守,导致连接、请求阶段效率低下。
核心优化方向:自定义Ktor客户端配置
skrape.it底层依赖Ktor实现HTTP请求,你可以通过自定义客户端参数来对齐cURL的性能:
1. 创建优化后的AsyncFetcher
import io.ktor.client.HttpClient import io.ktor.client.engine.apache.Apache import io.ktor.client.features.HttpTimeout import io.ktor.client.features.http2.Http2 import skrape.core.AsyncFetcher // 预配置优化的异步抓取器 private val optimizedAsyncFetcher = AsyncFetcher( client = HttpClient(Apache) { // 严格设置各阶段超时(对齐cURL的5秒级耗时) install(HttpTimeout) { connectTimeoutMillis = 5000 // 连接服务器超时5秒 socketTimeoutMillis = 10000 // 数据传输超时10秒 requestTimeoutMillis = 15000 // 整个请求周期超时15秒 } // 优化Apache连接池与请求参数 engine { customizeClient { setMaxConnTotal(20) // 最大总连接数 setMaxConnPerRoute(10) // 单域名最大连接数 } customizeRequest { // 模拟浏览器UA,避免被站点限流 setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") } } // 启用HTTP/2多路复用,提升请求效率 install(Http2) } )
2. 在抓取方法中使用优化后的Fetcher
override suspend fun searchDocuments(query: String): List<DocumentInfo> { return skrape(optimizedAsyncFetcher) { request { url = "https://wolnelektury.pl/szukaj/?q=$query" // 无需再设置超长timeout,已由客户端全局配置覆盖 } // ... 你的页面解析逻辑 } }
其他排查点
- 检查系统代理:skrape.it默认使用系统代理,若代理速度慢会导致超时,可手动关闭代理:
engine { customizeClient { setRoutePlanner(org.apache.http.impl.conn.DefaultRoutePlanner(null)) } } - 隔离请求阶段:暂时注释页面解析逻辑,仅发起HTTP请求并打印耗时,确认是请求还是解析环节导致的延迟
- 替换客户端引擎:若Apache引擎仍有问题,可切换到OkHttp引擎,通过
AsyncFetcher(client = HttpClient(OkHttp))配置
内容的提问来源于stack exchange,提问作者Piroks
相关产品推荐
相关产品推荐

