
老学长
2022-06-04
2700
原创

前情提要:项目中的爬虫使用HttpClient实现,不过最近发现爬虫的成功率很低
问题排查
简单介绍一下遇到这块问题的解决思路。首先我的爬虫功能全部封装在一个工具类里面,这时候就不要想着去debug什么的了,直接在工具类里面加一个main函数,调用一下一个功能函数在控制台就会打印我们需要的信息。
问题说明
问题在于HttpClient试图连接目的服务器的时候一直超时,根据观察,在测试的时候,每次在与目的服务器建立连接前,都有两次连接会超时,在默认情况下,无疑会让爬虫可用性大大降低(当然这种情况可能有偶发性,例如笔者在写文时测试反复几次均没有卡顿)。HttpClient在连接超时后就会切换ip重新尝试连接,切换几次后一般就可以连接了,我这边测试的均值在2至3次。
问题解决
给HttpClient增加超时属性,解决默认等待时间过长的问题,因为正常的ip连接等待时间很短,不可用ip等待多久都没用,干脆等不到就算逑。等待时间timeout我设置的2s,为了稳健一点保证正常连接不会丢失,但其实0.5就够用了。设置后整个代码的最坏情况运行时间为10s左右,但是保证了可用性,爬虫代码一般都是异步执行,对速度要求不高。
int timeout = 2;
RequestConfig config = RequestConfig.custom().
setConnectTimeout(timeout * 1000).
setConnectionRequestTimeout(timeout * 1000).
setSocketTimeout(timeout * 1000).build();
CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();