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

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

  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 教程JSOUP爬虫教程JSOUP超时分析处理
JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser
JSOUP教程JSOUP 乱码处理JSOUP生僻字乱码解决方案
JSOUP 教程JSOUP请求JSON ,JSOUP返回JSON 数据
JSOUP教程JSOUP的正确打开姿势。
Shiro教程(八)Shiro Freemarker标签的使用。
Shiro教程(六)Shiro整体的配置文件
Shiro教程(二)Maven管理Shrio Jar包
Elasticsearch教程(五) elasticsearch Mapping的创建
Elasticsearch教程(二),IK分词器安装
最新文章
Macbook teamviewer 突破5分钟,苹果电脑重置 Mac 地址,100%解决限制 220
腾讯云代金券 10000 元/ 30000 代金券领取技巧 324
SEO 换友情链接的主意事项,友情链接断链、友情链接套路说明 229
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 1903
Mac mtr 安装并使用,mrt: command not found 299
Java 集成阿里云消息队列,日志消息存储 497
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 472
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 837
SpringBoot 集成Spring-data-redis,redis对象序列化存储 2029
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 604
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 126781
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 108004
Elasticsearch教程(六) elasticsearch Client创建 78810
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 74434
Elasticsearch教程(二),IK分词器安装 73217
Elasticsearch教程(一),全程直播(小白级别) 65782
Elasticsearch教程(五) elasticsearch Mapping的创建 61877
Elasticsearch教程(三),IK分词器安装 (极速版) 56361
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 53539
Java 解析JSON,JSON-LIB jar包下载和使用。 48973

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

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

正在加载... ...