使用Python从imeicheck.com API获取IMEI数据并导入Oracle的问题求助
问题解决方案
一、获取全量IMEI数据
该网站公开API仅支持单IMEI查询,无法直接获取全量数据,可按以下思路处理:
- 先确认网站是否提供批量查询API:查看网站的API文档(若有),是否允许一次传入多个IMEI参数,或有专门的批量接口;
- 若无批量接口,需自行收集目标IMEI列表(注意合法性,避免使用未经授权的数据源),然后循环调用单IMEI查询接口:
- 调用时加入延迟(如
time.sleep(1)),避免因请求频率过高被网站封禁; - 使用
requests.Session()保持会话,提升请求效率;
- 调用时加入延迟(如
- 注意:IMEI属于设备敏感信息,爬取或使用需遵守相关法律法规及网站的使用条款。
二、Oracle插入错误(ORA-01036)
这个错误是因为绑定变量的数量/顺序与传入数据不匹配,结合你的代码,问题出在DataFrame构造和数据行生成环节,修正步骤如下:
修正DataFrame构造:
单IMEI API返回的是单个字典对象,直接用pd.DataFrame(data)会导致列结构异常,需改为pd.DataFrame([data])将其转为一行数据:data = response_API.json() df = pd.DataFrame([data]) # 用列表包裹单个字典,生成正确的行结构确保数据列与插入字段匹配:
检查DataFrame的列名是否与DIM_IMEI表的字段(IMEI, brand, models, model_name)对应,若列名不一致,需调整顺序或重命名:# 强制指定列顺序,确保与INSERT语句一致 df = df[['imei', 'brand', 'models', 'model_name']] # 若列名大小写不匹配,可重命名 df.columns = ['IMEI', 'brand', 'models', 'model_name']优化executemany调用:
可以使用命名绑定变量,避免顺序错误,代码更清晰:curs.executemany('''INSERT INTO DIM_IMEI(IMEI, brand, models, model_name) VALUES (:IMEI, :brand, :models, :model_name)''', df.to_dict('records')) # 直接传入字典列表,无需手动转rows
修正后的完整代码示例
import requests import pandas as pd import cx_Oracle import time # 示例:假设你有一个IMEI列表 imei_list = ["352322311421731", "另一个IMEI"] all_data = [] # 循环调用API获取数据 session = requests.Session() for imei in imei_list: url = f"https://alpha.imeicheck.com/api/modelBrandName?imei={imei}&format=json" response = session.get(url, verify=False) if response.status_code == 200: all_data.append(response.json()) time.sleep(1) # 加入延迟,避免被封禁 # 构造DataFrame df = pd.DataFrame(all_data) # 确保列顺序与表字段一致 df = df[['imei', 'brand', 'models', 'model_name']] df.columns = ['IMEI', 'brand', 'models', 'model_name'] # 插入Oracle数据库 conn_str = 'bi/testpasss@1.1.1.1:1521/ORABI' with cx_Oracle.connect(conn_str) as db: with db.cursor() as curs: curs.execute('TRUNCATE TABLE DIM_IMEI') # 使用命名绑定变量 curs.executemany('''INSERT INTO DIM_IMEI(IMEI, brand, models, model_name) VALUES (:IMEI, :brand, :models, :model_name)''', df.to_dict('records')) db.commit()
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

