JSOUP 教程,JSOUP爬虫教程,JSOUP超时分析与处理
JSOUP ,在我很久以前把它和 htmlparser 做了对比,而又用 JSOUP 来获取 JSON 数据 ,最近在使用 JSOUP 爬取一个网站的内容,发现几个问题,解决后并且分享一下。
JSOUP 超时分析与处理
下面说说超时的发现,有可能出现超时的原因,以及超时处理。
1.请求头信息得一致
当你捕获到一个采用JSOUP
去请求超时的链接,我是通过catch
去发现。
try{
doc = Jsoup.connect(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
.header("Connection", "close")//如果是这种方式,这里务必带上
.timeout(8000)//超时时间
.get();
} catch (Exception e) {//可以精确处理timeoutException
//超时处理
}
通过try···catch
去发现超时,然后结合自己的处理,这里要说几个问题。
- 请求头信息,在你尝试去爬取对方的内容的时候,需要尽可能的和你在http浏览器请求的请求头一致,注意是请求头,不是相应头。
- 在请求头里务必加上
Connection:close
,有同学可能会问,这个不是相应头里的吗?是的,有的时候你看到在请求头里,有的时候看到在相应头里,而且一般是Connection:keep-alive
,你加上就可以了。下面会讲到。 - 当发现对方拒绝请求的时候,把浏览器里看到的请求头全部加上,甚至 Cookie 也加上,注意换行和空格,需要自己处理下。尽量一行。
- 如果对方网站过弱,请采用单线程爬取,要不然会大量超时,甚至把对方
Kill
了。 - 如果对方有 IP 限制,采用 IP 代理,或者频率放缓慢一点。
下面看两张图对比下。
2.请求编码一致
其实下一篇我也会单独再说一下因为编码问题影响乱码的问题,可能有人会问了,编码问题,怎么还会影响超时?不是只会影响乱码吗?这里有一个细节,我们超时其实是分两种,一个是请求超时,一个是读取超时,而我的是读取超时。
这个答案我不能肯定的告诉你,但是我测试发现是会影响超时。开始是这样去请求,我还采用多次,请求最频繁超时的地方,我甚至失败重复请求6次。而且每次超时时间设置都是8秒,timeout(8000)//超时时间
。
try{
doc = Jsoup.connect(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
.header("Connection", "close")//如果是这种方式,这里务必带上
.timeout(8000)//超时时间
.get();
} catch (Exception e) {//可以精确处理timeoutException
try{
doc = Jsoup.connect(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
.header("Connection", "close")
.timeout(8000)
.get();
} catch (Exception e2) {
//超时处理,超时2次
}
}
我这里很杯具的告诉大家一个事情,我采用爬虫去爬取一些内容的时候,爬取了200多万层级较深的数据。结果发现有几万数据有乱码问题,初步查看,发现是一些生僻字,但是我在想不应该啊,我用的是UTF-8
,但是事实如此,经过我多次测试,还是发现乱码,结果我去看下对方的编码,页面是GBK
,而返回来的时候,数据的是 GB2312
编码,这是几个情况?来这一手?开始想着修复数据,但是修复的时候代码写的有问题,哈哈,越改越乱,所以想着还是再来一遍。这可是200多万单线程爬取的数据。
改版后成这样:
doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);
这里是简化版的,如果要设置请求头,请在new URL()
中设置,我发现对方没有限制请求头,就这样了。
经过测试1000
次原来乱码数据,发现很好,不乱码,并且发现一个问题,就是不超时,我都是采用请求一次,到后面我采用多线程请求了300万
次,一次都没超时(当然对方网站我看了下有60
多个节点的 CDN )。
乱码也解决了,超时也解决了。还有一个现象。比以前处理速度快了,也就是读取抓取页面快了。
因为我是读取时候超时,但是通过测试得出在读取的时候,解析数据数据乱码,就慢了,就超时了(当然没有严格去验证,我知识推敲,欢迎在厦下面留言)。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/224.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。