Beispiel #1
0
class IP2Region():
    '''
    解析ip地址:lookup(ip)方法将ip转化成("省份","地区")
    '''

    def __init__(self):
        self.filename = 'qqwry.dat'
        self.dat_path = os.path.join(base_config.BASE_PATH, 'utils', self.filename)
        self.q = QQwry()
        if os.path.exists(self.dat_path):
            self.q.load_file(self.dat_path)
            print(self.q)
        else:

            print('初始化更新ip库')
            self.update_dat()
            self.reload_dat()
            return

    def get_lastone(self):
        '''
        返回最后一条数据,最后一条通常为数据的版本号
        没有数据则返回一个None
        :return:
        '''
        version = self.q.get_lastone()
        return version

    def update_dat(self):
        '''
        异步更新,使用线程或者celery更新IP数据库源
        :return:(bool) 成功后返回一个正整数,是文件的字节数;失败则返回一个负整数。
        '''
        result = updateQQwry(self.dat_path)
        if result > 0:
            print('ip库更新成功')
            return True
        print('ip库更新失败,网络出现故障')
        return False

    def lookup(self, ip):
        '''
        解析ip地址
        :param ip(str): 要解析的ip地址
        :return: 找到则返回一个含有两个字符串的元组,如:('国家', '省份')没有找到结果,则返回一个None
        '''
        return self.q.lookup(ip)

    def reload_dat(self):
        '''
        重载IP数据源,当IPdat数据更新的时候,使用此方法更新数据
        :return: (bool) 重载成功返回True,重载失败返回Flase
        '''
        self.q.clear()
        if not self.q.is_loaded():
            self.q.load_file(self.dat_path)
            return True
        return False
Beispiel #2
0
def get_raw_data():
    """
    得到raw_data
    :return:返回预处理后的数据
    """
    filename = LOG_PATH
    qqwry_path = QQWRY_PATH

    ip_dict = {}  # 存不重复的ip及其city
    log_text = get_log_text(filename)  # 获取日志原始文件
    parsed_log_list = parse(log_text)  # 获取解析完的日志

    # 加载纯真ip数据库
    flag = 0
    q = QQwry()
    while not q.is_loaded():
        # 加载3次失败后改用其他方案
        if flag == 3:
            break
        q.load_file(qqwry_path)
        flag += 1

    raw_data = []
    Ip_raw_data = namedtuple(
        'ip_data',
        ['log_time', 'ip', 'referrer', 'client', 'method', 'status', 'city'])
    for line in parsed_log_list:
        log_time = parse_nginx_date(line['date'] + ':' + line['time'],
                                    line['tz'])
        log_ip = line['origin']
        if log_ip not in ip_dict:
            ip_dict[log_ip] = get_address_by_ip(line, q, flag)
        log_city = ip_dict[log_ip]
        raw_data.append(
            Ip_raw_data(log_time, log_ip, line['referrer'], line['client'],
                        line['method'], line['status'], log_city))
    return raw_data
Beispiel #3
0
      if int(download_ret) < 0:
          print("%sDownload QQwry.dat Error:" % ret_time(), int(download_ret))
          print("-1:下载copywrite.rar时出错\n"
                "-2:解析copywrite.rar时出错\n"
                "-3:下载qqwry.rar时出错\n"
                "-4:qqwry.rar文件大小不符合copywrite.rar的数据\n"
                "-5:解压缩qqwry.rar时出错\n"
                "-6:保存到最终文件时出错")
          sys.exit()
      else:
          print("%sDownload QQwry.dat Success~ Status:%s" % (ret_time(), int(download_ret)))
  qq_wry = QQwry()
  qq_wry.load_file('QQway.dat')
  # Run
  print(
      'Init->IP Data: Load:%s Version:%s-%s' % (qq_wry.is_loaded(), qq_wry.get_lastone()[0], qq_wry.get_lastone()[1]))
  print('Init->Start Time: %s' % ret_time())
  print('################################################\n')
 	#sys.argv.append('*')
  #sys.argv.append('200')
  global SETTHREAD
  global ip_file
  global ip_info_file
 
  try:
      SETTHREAD = sys.argv[2]
      ip_file = open("./results/IP-%s段.txt" % sys.argv[1].split('-')[0], "w")
      ip_info_file = open("./results/IP归属地-%s段.txt" % sys.argv[1].split('-')[0], "w")
      iplist = ip_range(sys.argv[1].split('-')[0], sys.argv[1].split('-')[1])
      print("%sScan IP:%s Thread:%s" % (ret_time(), sys.argv[1], sys.argv[2]))
      print(ret_time() + 'Will scan ' + str(len(iplist)) + " host .. Sleep 1sec...\n")