Python 实现批量查询IP并解析为归属地

本文介绍了如何使用Python进行批量查询IP地址并解析其归属地。环境配置文件db_udw.env被提及,作者虽然接触Python时间不长,但欢迎读者在评论区交流疑问和观点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景:
最近工作中做了一个小功能,目的是为了分析注册用户区域分布和订单的区域分布情况。所以需要将其对应的IP信息解析为归属地,并同步每天同步更新。
线上跑起来效率还是有优化的空间,优化的方向:在调用IP查询API过程可以调整为多线程并行解析IP。后续会更新这方便的调整。
技术: Pyhton3
postgreSQL
env配置文件

附加信息:iP地址查询(iP138官方企业版):https://market.aliyun.com/products/56928004/cmapi015606.html#sku=yuncode960600002
.可提供免费的IP查询API.

二、实现思路: 1、 读取数据库IP信息
2、 调用第三方IP解析API进行解析
3、 将解析归属地信息存入数据库
三、几点说明: 1、环境信息等参数配置
2、日志输出
3、异常处理: 数据库连接异常
请求连接查询IP的URL异常:HTTP ERROR 503
4、json,字典,数组等类型数据输入输出
5、分页查询并批量解析
5.功能实现很简单,所以就没有做详细的介绍了。详情可直接看完整代码,有详细的备注。

四、步骤简单介绍:
针对实现思路的3个步骤写了3个函数,彼此调用执行。
函数:
def get_ip_info(table_name):
def get_ip_area(table_name):
def ip_write_db(table_name):
调用:
ip_write_db("h_user_stat")

五、关键代码说明:
语法:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
 # 对从数据库表中出查询的IP进行解析
       querys = 'callback&datatype=jsonp&ip=' + get_ip
       bodys = {}
       url = host + path + '?' + querys
       request = urllib.request.Request(url)
       request.add_header('Authorization', 'APPCODE ' + appcode)

       # 连接url时可能会出现 ERROR: HTTP Error 503: Service Unavailable
       try: 
         response = urllib.request.urlopen(request)
       except Exception as e:
         logging.error(e) # 输出异常日志信息 
         time.sleep(5)
         response = urllib.request.urlopen(request)
       finally:
         content = response.read()
         ip_area = content.decode('utf8')
         ip_area = json.loads(ip_area)['data'] # json类型转字典类型并取'data'健值
         arr.append([get_ip, ip_area]) # 将结果集存于二元数组
说明:从数据库分页查询固定数量的IP存入数组,并遍历该数组并将解析后的地区信息data健值存于二元数组中。
 
  

 

 
六、Python代码实现如下:

  1 # 导入psycopg2包
  2 import psycopg2, time,datetime,sys
  3 import json
  4 import urllib, urllib.request
  5 import os
  6 import configparser
  7 import logging
  8                      # purpose: 连接数据库读取表IP信息
  9 def get_ip_info(table_name):
 10     # 全局变量作用局部作用域
 11     global pagesize # 每页查询数据条数
 12     global rows_count
 13 
 14     # 测试1
 15     starttime_1 = time.time()
 16     # 建立游标,用来执行数据库操作
 17     cur = conn.cursor()
 18     # 执行SQL命令
 19     cur.execute("SELECT remote_ip FROM (select remote_ip,min(created_at) from " + table_name + " group by remote_ip) h1 where remote_ip is not null and remote_ip <> '' and  not exists (select 1 from d_ip_area_mapping h2 where h1.remote_ip = h2.remote_ip) limit " + str(pagesize) + ";")
 20 
 21 
 22     # 获取结果集条数
 23     rows_count = cur.rowcount
 24    
 25     # print('解析用户IP的总数:' + str(rows_count))
 26 
 27      # 当有未解析的用户的IP,返回元组,否则退出程序
 28     if rows_count > 0:
 29       # 获取SELECT返回的元组
 30       rows =  cur.fetchall()        # all rows in table
 31 
 32       for row in rows:
 33           tuple = rows
 34 
 35 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值