Java爬虫(一)存在的问题及解决办法:
1. 获取数据的速度远大于处理数据的速度,导致队列中数据积累
措施: 对队列中的数据进行判断,若队列为空则获取数据,若不为空则睡眠
while(true){
byte[] msg=ju.rpop(redisKey_wemedia);
if(msg==null){
core();
}
else if(msg.length>1){
ju.lpush(redisKey_wemedia, msg);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2. 从队列中获取数据时,会存在异常,这使得返回值为空,这依然会使队列数据积累,所以需要另做一个特殊返回值表示异常
public byte[] rpop(byte[] key) {
byte[] bytes = null;
Jedis jedis = null;
if(jedisPool==null)
{
init();
}
try {
jedis = jedisPool.getResource();
bytes = jedis.rpop(key);
} catch (Exception e) {
jedisPool.returnBrokenResource(jedis);
e.printStackTrace();
//
bytes=new byte[1];
bytes[0]=Byte.valueOf("0");
return bytes;
} finally {
close(jedis);
}
return bytes;
}
3. 细节错误:
错误代码:
String url=json.getString("url")+"&ispc=1";
//System.out.println(url);
int end=url.indexOf(".html")+".html".length();
if(end>0){//这里会一直为真,而且块内获取的url是不正确的格式
url=url.substring(0,end)+"?ispc=1";
}
else{
continue;
}
应该改为:
String url=json.getString("url")+"&ispc=1";
//System.out.println(url);
int end=url.indexOf(".html");
if(end>0){
end+=".html".length();
url=url.substring(0,end)+"?ispc=1";
}
else{
continue;
}
写某网站的爬虫,结果一不小心把线程写多了,导致别人发现了,直接过来投诉了。。。啊~