技术博客

JSOUP 教程,JSOUP爬虫教程,JSOUP超时分析与处理

信息发布:soゝso 发布日期:2017-05-13 21:24 热度:788 分享到:

  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 去发现超时,然后结合自己的处理,这里要说几个问题。

  1. 请求头信息,在你尝试去爬取对方的内容的时候,需要尽可能的和你在http浏览器请求的请求头一致,注意是请求头,不是相应头。
  2. 在请求头里务必加上Connection:close ,有同学可能会问,这个不是相应头里的吗?是的,有的时候你看到在请求头里,有的时候看到在相应头里,而且一般是 Connection:keep-alive ,你加上就可以了。下面会讲到。
  3. 当发现对方拒绝请求的时候,把浏览器里看到的请求头全部加上,甚至  Cookie  也加上,注意换行和空格,需要自己处理下。尽量一行。
  4. 如果对方网站过弱,请采用单线程爬取,要不然会大量超时,甚至把对方Kill 了。
  5. 如果对方有  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  )。

乱码也解决了,超时也解决了。还有一个现象。比以前处理速度快了,也就是读取抓取页面快了。

因为我是读取时候超时,但是通过测试得出在读取的时候,解析数据数据乱码,就慢了,就超时了(当然没有严格去验证,我知识推敲,欢迎在厦下面留言)。

本文主题

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

¥我需要走的更远,点击我 赞助。 如果还有疑问,点击我加群,为你提供最好的解答。


工具导航地图