运营商数据自动抓取实现

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

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

运营商数据自动抓取实现_第1张图片

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

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

你可能感兴趣的:(爬虫,python,数据挖掘)