运营商数据自动抓取实现

各运营商下属合作单位存在大量活动指标,手动进行系统查询过于繁琐,常常无法完成制定的指标,由于各个省份系统集成商又不同,所以操作流程亦各不相同,但是我们仍然可以通过模拟登陆爬虫来寻找蛛丝马迹。

通常情况下都会核心系统模拟登录爬取,本人做过吉林、河北的核心数据抓取,基本大同小异,但是爬取核心系统的稳定性和速度都不是很理想,其实每个省份提供的营销系统都不尽相同,其实从分支系统爬取系统更方便,因为运营商针对核心系统的维护更新和监管要比分支系统力度大,所以分支系统更稳定、更安全。针对吉林,核心系统抓取和分支系统抓取就有明显区别,无论从速度和安全性再到难度,都要有很大的区别。以最近做的移动举例。每天百万级别的查询量可以保证。

 其实最大的有点就是分支系统有跟多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<String, String> 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<String, String> 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);
				}
			}
		}
	}
	

 另外其他省份的业务也大同小异,针对不同系统,不同查询项输出都可实现

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年一梦惊觉醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值