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

JSON 2017-05-13 21:24:55 20479

  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  )。

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

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

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/224.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

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

关于作者
一个低调而闷骚的男人。
相关文章
JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser
JSOUP教程JSOUP 乱码处理JSOUP生僻字乱码解决方案
JSOUP 教程JSOUP请求JSON ,JSOUP返回JSON 数据
JSOUP教程JSOUP的正确打开姿势。
Java爬虫Jsoup 取大众点评、美团商家信息电话号码解决方案
robots协议解读和作用(学习爬虫必看)
Jsoup 提交参数乱码,解决思路,解决过程及解决方案
Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫
Shiro教程(四)Shiro + Redis配置
Shiro教程(五)Shiro + Redis实现
最新文章
PHP变量剖析 11
SQL全外连接剖析 119
SQL自然连接剖析 147
springboot启动原理 245
SQL右连接【RIGHT JOIN】详解及图解 450
SQL左链接【LEFT JOIN】详解及图解 357
SQL非等值连接剖析 262
SQL等链接剖析 291
SQL内连接详解及图解 385
python之numpy常用的100种数值相关方法及代码示例 231
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 679241
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674561
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 599031
免费天气API,天气JSON API,不限次数获取十五天的天气预报 565278
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 551715
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509186
Elasticsearch教程(四) elasticsearch head 插件安装和使用 479645
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 262820
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244092
Elasticsearch教程(一),全程直播(小白级别) 225127
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...