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

soゝso 2017-05-13 21:24:55 13191

  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 取大众点评、美团商家信息电话号码解决方案
Jsoup 提交参数乱码,解决思路,解决过程及解决方案
Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫
Shiro教程(四)Shiro + Redis配置
Redis 单线程模型分析
Shiro教程(五)Shiro + Redis实现
最新文章
当我谈 HTTP 时,我谈些什么? 844
新浪短链(t.cn)最新申请官方API的方法讲解。 5196
QUIC / HTTP3 协议详细分析讲解 1492
恭喜那个做云存储的七牛云完成 F 轮 10 亿人民币的融资,开启新的云旅程 2257
Autojs怎么安全加密?Autojs在线加密工具注意事项。 3736
Java JSON 组件选型之 FastJson 为什么总有漏洞? 11767
使用七牛云存储实现图片API,自动删除图片方案合集 3000
神速ICP备案经验分享,ICP备案居然一天就通过了 4206
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 4319
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 5505
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 477060
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 437273
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 373920
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 369729
免费天气API,天气JSON API,不限次数获取十五天的天气预报 334938
Elasticsearch教程(四) elasticsearch head 插件安装和使用 245561
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 213651
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 151039
Elasticsearch教程(一),全程直播(小白级别) 129968
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 112207
支付扫码

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

查看我的收藏

正在加载... ...