java爬虫使用jsoup.jar包-自定义webUrl编码方式

一、本文主要讲述为java爬虫使用jsoup.jar包,可自定义webUrl的编码。

二、前述:博主使用jsoup.jar包爬取新浪,关键字为中文时爬取内容为乱码,若关键字为英文时爬取内容正常,

经在eclipse中调试发现jsoup.jar包会将包含汉字的url路径 解析为utf-8编码格式路径,然而新浪新闻网会将包含汉字的url解析为编码格式为GB2312的url.

例如搜索关键字为:苹果 

①新浪新闻生成路径为    :http://search.sina.com.cn/?q=%C6%BB%B9%FB&range=title&c=news&sort=time

②jsoup.jar包生成路径为:http://search.sina.com.cn/?q=%E8%8B%B9%E6%9E%9C&range=title&c=news&sort=time

①中的路径为能正常搜索路径,结果正常   GB2312编码    苹果 --> %C6%BB%B9%FB

②中的路径非正常,结果为乱码. UTF-8编码  苹果 --> %E8%8B%B9%E6%9E%9C


jsoup.jar包中的org.jsoup.helper.HttpConnection类static Response execute(Connection.Request req, Response previousResponse  方法中 调用serialiseRequestUrl方法拼路径,最终定位到此行,DataUtil.defaultCharset代表的是 static final String defaultCharset = "UTF-8"

url.append(java.net.URLEncoder.encode(keyVal.key(), DataUtil.defaultCharset)).append('=')
.append(java.net.URLEncoder.encode(keyVal.value(), DataUtil.defaultCharset));

至此可看到解析url编码为固定UTF-8格式.

继续使用原jsoup.jar包此方法并不能满足我们的爬取新浪新闻网的需求,故修改原jar包,添加自定义编码

1、在org.jsoup.Connection中的

interface Request extends Base<Request>{ } 接口中添加

Request webEncode(String webEncode); //使用时定义编码格式
String webEncode();//本jar包中使用,判断webUrl编码方式

2、在org.jsoup.helper.HttpConnection中的定义  --判断是否为空,若不为空则赋值编码方法

public Connection webEncode(String webEncode) {
if (null != webEncode) {
req.webEncode(webEncode);
}
return this;
}

3、 在org.jsoup.helper.HttpConnection中

static class Request 中添加

private String webEncode;

@Override
public Request webEncode(String webEncode) {//返回编码格式
this.webEncode = webEncode;
return this;
}

@Override
public String webEncode() {//获取编码格式
return webEncode;
}

4、在org.jsoup.helper.HttpConnection中

serialiseRequestUrl(Connection.Request req)方法中

原转码代码:url.append(java.net.URLEncoder.encode(keyVal.key(), DataUtil.defaultCharset)).append('=')
.append(java.net.URLEncoder.encode(keyVal.value(), DataUtil.defaultCharset));

转换为:if (matcher.find() && (null != req.webEncode()) && !(req.webEncode().equals(""))) {
url.append(java.net.URLEncoder.encode(keyVal.key(), req.webEncode())).append('=')
.append(java.net.URLEncoder.encode(keyVal.value(), req.webEncode()));
} else {
url.append(java.net.URLEncoder.encode(keyVal.key(), DataUtil.defaultCharset)).append('=')
.append(java.net.URLEncoder.encode(keyVal.value(), DataUtil.defaultCharset));
}

至此 jsoup.jar包更改完毕,打包即可用.

三、使用方法

// 设置动态url编码 --新浪 GB2312

Connection conn = Jsoup.connect(url);
conn.request().webEncode("GB2312");


以上为本人原创,若有使用疑问请联系。   

--下面上传文件为更改后的jsoup.jar,包括源码与.jar文件链接。      

http://download.csdn.net/detail/zuijiuhengdao/9914420

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值