一、本文主要讲述为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.youkuaiyun.com/detail/zuijiuhengdao/9914420