您的位置:首页 > 编程语言 > Java开发

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

2017-07-28 22:03 513 查看
一、本文主要讲述为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 爬虫 jsoup
相关文章推荐