各运营商下属合作单位存在大量活动指标,手动进行系统查询过于繁琐,常常无法完成制定的指标,由于各个省份系统集成商又不同,所以操作流程亦各不相同,但是我们仍然可以通过模拟登陆爬虫来寻找蛛丝马迹。
通常情况下都会核心系统模拟登录爬取,本人做过吉林、河北的核心数据抓取,基本大同小异,但是爬取核心系统的稳定性和速度都不是很理想,其实每个省份提供的营销系统都不尽相同,其实从分支系统爬取系统更方便,因为运营商针对核心系统的维护更新和监管要比分支系统力度大,所以分支系统更稳定、更安全。针对吉林,核心系统抓取和分支系统抓取就有明显区别,无论从速度和安全性再到难度,都要有很大的区别。以最近做的移动举例。每天百万级别的查询量可以保证。
其实最大的有点就是分支系统有跟多BUG可以利用,就像本人最近做的爬虫
1:只要有移动号码就可能爬取数据,无需使用运营商开放给你的权限号码
2:爬取速度快,每天百万级别查询量
3:安全性好,运营商无从查询
代码如下
package com.hs.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hs.common.util.RandomUtil;
import com.hs.common.util.RepUtils;
import com.hs.common.util.SpringUtils;
import com.hs.common.util.UUIDUtils;
import com.hs.transaction.seat.service.SeatService;
import com.hs.transaction.seat.util.MemUtils;
public class RepThread extends Thread {
public Logger logger = LoggerFactory.getLogger("repLog");
private SeatService seatService;
private int threadIndex;
public RepThread(int threadIndex) {
this.threadIndex = threadIndex;
}
@Override
public void run() {
super.run();
while (MemUtils.THREAD_FLAG) {
try {
//获取查询号码
Map phoneMap = MemUtils.getPoolMap(threadIndex);
if (phoneMap == null) {
continue;
}
String queryPhone = phoneMap.get("phoneNo");
String queryEncodeNo = phoneMap.get("encodePhone");
MemUtils.PHONE_SUB_NOW = queryPhone;
if (MemUtils.LIMIT_PHONE_MAP == null) {
logger.error("权限号码LIMIT_PHONE_MAP为空!");
continue;
}
//获取权限号码
Map limitMap = getLimitInfo();
if(limitMap == null){
logger.error("未获取到LIMIT_PHONE_MAP随机权限号码!");
continue;
}
String limitNo = limitMap.get("limitNo");
String limitEncodeNo = limitMap.get("limitEncodeNo");
logger.info("查询组合,查询号码:" + queryPhone + ",权限号码:" + limitNo);
//查询
String rsp = RepUtils.queryProcess(queryEncodeNo, limitEncodeNo);
logger.info("查询结果:" + rsp);
//解析查询结果
String pareFlag = pareQueryRsp(rsp, queryPhone);
//返回false基本是权限号码无权限
if("false".equals(pareFlag)){
while(true){
limitMap = getLimitInfo();
if(limitMap == null){
logger.error("再次未获取到LIMIT_PHONE_MAP随机权限号码!");
continue;
}
limitNo = limitMap.get("limitNo");
limitEncodeNo = limitMap.get("limitEncodeNo");
logger.info("再次查询组合,查询号码:" + queryPhone + ",权限号码:" + limitNo);
//查询
String rsp1 = RepUtils.queryProcess(queryEncodeNo, limitEncodeNo);
logger.info("再次查询结果:" + rsp1);
//解析查询结果
pareFlag = pareQueryRsp(rsp, queryPhone);
if(!"false".equals(pareFlag)){
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
} finally {
try {
sleep(MemUtils.SLEEP_TIME*1000);
} catch (InterruptedException e) {
logger.error(e.getMessage(), e);
}
}
}
}
另外其他省份的业务也大同小异,针对不同系统,不同查询项输出都可实现