https://blog.youkuaiyun.com/persistencegoing/article/details/84376427
练习爬数据写多了经常遇到一些很恶心的坑.
1常见的就是如果httpPost = new HttpPost(url)报错
一般都是你的url格式的错误,比如最常见的空格问题,好好检查格式,在index XXX 会提示你在某个位置的错误.
2org.apache.http.client.ClientProtocolException异常
Client的协议异常,我出这个错误的时候是因为url有需要编码的参数,但是我把整个url路径都给编码了,client无法识别这个路径问题
3url中的空格编码问题
一般可以这样,把空格转为+,但是我在爬XX保险系统的时候,转义成+不行,下面我就分享一下我的解决方案
将空格转为%20,下面是代码
public static String replaceSpace(StringBuffer str) {
int spacenum = 0;//spacenum为计算空格数
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
spacenum++;
}
int indexold = str.length()-1; //indexold为为替换前的str下标
int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
for(;indexold>=0 && indexold<newlength;--indexold){
if(str.charAt(indexold) == ' '){ //
str.setCharAt(indexnew--, '0');
str.setCharAt(indexnew--, '2');
str.setCharAt(indexnew--, '%');
}else{
str.setCharAt(indexnew--, str.charAt(indexold));
}
}
return str.toString();
}
4今天遇到一个时间的问题,很TM贱
get请求方式中参数+一个日期对象,日期对象是Thu Nov 29 16:53:25 UTC+0800 2018,这个日期对象还有空格,而且该对象加了时区.以下是转换代码
public static String dateTransfer(Date time){
SimpleDateFormat sdf=new SimpleDateFormat("EEE MMM dd HH:mm:ss 'UTC'Z yyyy",Locale.US);
try{
return sdf.format(time);
}catch(Exception e){
e.printStackTrace();
return null;
}
}
5在爬的时候,一定要注意请求是get还是post,是utf-8还是GBK
6对于参数一定要注意细节,在某些时候0和0.0都是有很大的区别的,一个小数点可能你得到的是500
7注意网页中的标记NO,你在请求的时候可能会有一些莫名的参数,而这个参数可能来自于网页,注意分析
8分析每次请求的逻辑,逻辑顺序不清楚,会导致某些参数你不清楚是哪儿来的
9在爬的时候最重要的就是耐心,着重逻辑,没有耐心的人千万不要尝试,因为还未开始就可能结束
10注意请求状态码,请求得到的是200,400,404还是500,如果是302,解析html,得到新的url再请求.
11很多项目中会涉及你的IP,浏览器类型和版本,还有你爬的频率,多学习技术和反爬的技术才能走的更远.
希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职 群号:721515304