需求:使用python将接口数据导入到MySQL中
首先想到的是使用kettle将接口的数据导入到MySQL。
大致流程如下:
从kettle的组件中找到以下控件建立流程:
配置控件的参数,如下
生成记录控件:目的是为rest_client 做铺垫的
url:就是访问的地址
body:就是请求体
request_method:就是请求的方法
rest_client控件:将生成记录的参数添加进来。
json 输入控件:目的是解析返回来的json数据,在字段的文本空中选择要 处理的数据,如下所示:
表输入:目的是将数据流中的数据保存到数据库中。
数据库连接:选择要同步的数据库和数据表。数据表中的地段最好和数据流中的字段对应。
在数据库字段中 选择相对应的字段名,如下:
经过以上操作,就可以将post接口的数据存储到数据库中。
第二种方法:就是使用python将接口数据导入
代码展示如下:
from datetime import datetime
import requests
import pymysql
# 发起POST请求并处理数据
def process_post_data(url):
# 发起POST请求
headers = {'Content-Type': 'application/json'}
response = requests.post(url,headers=headers,verify=False)
if response.status_code == 200:
# 解析响应数据
data = response.json()
# 提取数据字段
vegetableBaskets = data['data']['vegetableBaskets']
times = data['data']['names']
grainOil = data['data']['grainOil']
agricultures = data['data']['agricultures']
# 连接到MySQL数据库
conn = pymysql.connect(host="192.168.100.44",
port=23306,
user="root",
passwd="syyU!F$LhN@2023",
db="post")
# 打开游标
cursor = conn.cursor()
try:
# 删除表
drop_table_query = "drop table if exists post_data"
cursor.execute(drop_table_query)
conn.commit()
# 新建表
create_table_query = """CREATE TABLE `post_data` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`vegetableBaskets` varchar(255) DEFAULT NULL COMMENT '蔬菜篮',
`Times` datetime DEFAULT NULL COMMENT '时间',
`grainOil` varchar(255) DEFAULT NULL COMMENT '谷物油',
`agricultures` varchar(255) DEFAULT NULL COMMENT '农业',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"""
cursor.execute(create_table_query)
conn.commit()
print('删除,新建操作成功')
# 执行插入数据的SQL语句
insert_query = "INSERT INTO post_data (vegetableBaskets, Times, grainOil, agricultures) VALUES ( %s, %s, %s, %s)"
# 执行插入操作
for i in range(len(vegetableBaskets)):
values = (vegetableBaskets[i], datetime.strptime(times[i], '%Y年%m月%d日'), grainOil[i], agricultures[i])
cursor.execute(insert_query, values)
cursor.execute(insert_query, values)
# 执行操作
conn.commit()
print('Data inserted successfully.')
except Exception as e:
conn.rollback()
print('Error: {}'.format(str(e)))
finally:
# 关闭游标和连接
cursor.close()
conn.close()
else:
print('POST request failed with status code {}'.format(response.status_code))
# 示例调用
post_url = '你想访问的url'
process_post_data(post_url)
一开始,在执行的时候会报一个错误,错误如下:
requests.exceptions.SSLError: HTTPSConnectionPool(host='ncpscxx.moa.gov.cn', port=443): Max retries exceeded with url: /product/common-price-index/getIndexList (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1125)')))
解决办法:他这是代理证书的问题
只需要将 response = requests.post(url,headers=headers)里面加上verify=False,
默认情况下,当你使用一个网络库(例如requests)发送HTTPS请求时,它会验证服务器的SSL证书,以确保与服务器之间的安全连接。这是一种安全的做法,因为它防止了中间人攻击和其他安全威胁。
然而,有时候你可能会遇到一些特殊情况,例如服务器的证书无效或无法验证,或者你想忽略证书验证以简化开发过程。在这些情况下,你可以使用verify=False
参数选项来禁用证书验证。
不禁用证书的方法暂时还没有探究出来。
还会有以下的错误:
InsecureRequestWarning: Unverified HTTPS request is being made to host 'ncpscxx.moa.gov.cn'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
warnings.warn(
删除,新建操作成功
Data inserted successfully.
Process finished with exit code 0
这个错误的问题,不影响程序的运行
分析:urlib3 基于证书验证的级别出发不同的警告,比如说 InsecureRequestWarning ,没有验证的时候回出现这个警告。当然,未经验证的HTTPS URL时不被提倡的,如果你想强制取消警告,你可以使用 “disable_warnigns():
解决:你只需要在代码中加入以下代码
import urllib3
def test():
urllib3.disable_warnings()
全部代码:
from datetime import datetime
import requests
import pymysql
# urlib3 基于证书验证的级别出发不同的警告,比如说 InsecureRequestWarning ,没有验证的时候会出现这个警告。如果你想强制取消警告,你可以使用 “disable_warnigns():”加入下面代码
import urllib3
def test():
urllib3.disable_warnings()
# 发起POST请求并处理数据
def process_post_data(url):
# 发起POST请求
headers = {'Content-Type': 'application/json'}
response = requests.post(url,headers=headers,verify=False)
if response.status_code == 200:
# 解析响应数据
data = response.json()
# 提取数据字段
vegetableBaskets = data['data']['vegetableBaskets']
times = data['data']['names']
grainOil = data['data']['grainOil']
agricultures = data['data']['agricultures']
# 连接到MySQL数据库
conn = pymysql.connect(host="192.168.100.44",
port=23306,
user="root",
passwd="syyU!F$LhN@2023",
db="post")
# 打开游标
cursor = conn.cursor()
try:
# 删除表
drop_table_query = "drop table if exists post_data"
cursor.execute(drop_table_query)
conn.commit()
# 新建表
create_table_query = """CREATE TABLE `post_data` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`vegetableBaskets` varchar(255) DEFAULT NULL COMMENT '蔬菜篮',
`Times` datetime DEFAULT NULL COMMENT '时间',
`grainOil` varchar(255) DEFAULT NULL COMMENT '谷物油',
`agricultures` varchar(255) DEFAULT NULL COMMENT '农业',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"""
cursor.execute(create_table_query)
conn.commit()
print('删除,新建操作成功')
# 执行插入数据的SQL语句
insert_query = "INSERT INTO post_data (vegetableBaskets, Times, grainOil, agricultures) VALUES ( %s, %s, %s, %s)"
# 执行插入操作
for i in range(len(vegetableBaskets)):
values = (vegetableBaskets[i], datetime.strptime(times[i], '%Y年%m月%d日'), grainOil[i], agricultures[i])
cursor.execute(insert_query, values)
cursor.execute(insert_query, values)
# 执行操作
conn.commit()
print('Data inserted successfully.')
except Exception as e:
conn.rollback()
print('Error: {}'.format(str(e)))
finally:
# 关闭游标和连接
cursor.close()
conn.close()
else:
print('POST request failed with status code {}'.format(response.status_code))
# 示例调用
if __name__ == '__main__':
post_url = '你要访问的url'
process_post_data(post_url)