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
二、前述:博主使用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命令执行jar包(里面的main函数,无web.xml文件)的方式(包括依赖其它的jar包),使用Google-Guava Concurrent包里的Service框架,maven工程
- Java使用自定义的tableModel,设置可编辑方式
- Webdnpro for java调用BAPI(方式二) 使用JCO
- 【Java.Web】监听器 —— Listener(*** 使用自定义Listener进行初始化工作 ***)
- Java Web应用程序:Oozie及其使用方式
- 使用HttpWebRequest发送自定义POST请求(以http方式推送消息)
- java 将应用程序打成可执行的JAR包,然后使用批处理方式运行
- Storm Spark Scala 混合代码快速编译打包jar方式,然后java风格使用(朋友咨询)
- Java爬虫框架WebMagic的使用总结
- 使用Jsoup.jar写的工具类(java提取Html中的文本)
- [置顶] maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程
- JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet
- 转: Linux下使用java -jar运行可执行jar包的正确方式
- java web 使用json要加入的jar 文件
- java 将应用程序打成可执行的JAR包,然后使用批处理方式运行
- 基于webmagic的java网页爬虫,抓取网页指定节点,然后使用dom4j分析xml数据
- JavaWeb上传下载使用jspsmartupload.jar
- web工程中jar读取 配置的文件,java工程中jar 读取配置的文件方式
- [JavaWeb基础] 012.Struts2 自定义标签使用
- Java Web应用程序:Oozie及其使用方式