1.先编写一个socket服务端模拟web前端,并发布json数据:
import socket
server=socket.socket()
ip_port=('127.0.0.1',8005)
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
while 1:
try:
from_client_msg = conn.recv(1024).decode('utf-8')
print("来自客户端的消息",from_client_msg)
message = b'HTTP/1.1 200 ok\r\n\r\n'
conn.send(message)
with open('2.html','r',encoding='utf-8') as f:
data = f.read()
conn.send(data.encode('utf-8'))
conn.close()
except Exception:
break
2.html文件写入实现准备好的json,当然只是模拟,真正是从数据库读取的数据生成json文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{"code":200,"data":[{"datatime":"2022-01-01 20:00:00","uploadtime":"2022-01-01 20:25:05","value_2473":37,"value_2481":-77.8,"value_2483":0.9,"value_2484":26,"value_4402":0.009,"value_4404":0.8,"value_4405":0.012,"value_4406":-99,"value_4407":-99,"value_4467":0.059,"value_4468":0.071,"value_4471":0.016,"value_4D71":0.022,"value_4472":-99,"value_4474":-99,"value_4482":1017.4,"value_4485":-99,"value_4486":0.101,"value_4487":-99,"value_4488":-99,"value_4489":-99,"value_448A":0.053,"value_448B":-99,"status_2473":0,"status_2481":0,"status_2483":0,"status_2484":0,"status_4402":0,"status_4404":0,"status_4405":0,"status_4406":5,"status_4407":5,"status_4467":0,"status_4468":0,"status_4471":0,"status_4D71":0,"status_4472":5,"status_4474":5,"status_4482":0,"status_4485":5,"status_4486":0,"status_4487":5,"status_4488":5,"status_4489":5,"status_448A":0,"status_448B":5,"level":2,"levelName":"良","typeName":"二级","primaryPollutant":"PM10","overlimitPollutant":"","iaqi_4402":3,"iaqi_4404":8,"iaqi_4467":30,"iaqi_4471":5,"iaqi_4D71":-99,"iaqi_4486":76,"iaqi_448A":73,"aqi":76,"code":130100,"name":"石家庄市","cityname":"石家庄市","provinceName":"河北省"}],"message":"OK"}
</body>
</html>
前台访问一下:
编写获取json程序:
import requests
from lxml import etree
url = 'http://127.0.0.1:8005/'
response = requests.get(url)
response.encoding = 'utf-8'
page_text = response.text
text = etree.HTML(page_text)
div_list = text.xpath('/html/body/text()')
print(div_list[0].strip())
如下:
这样获取到的是一个json的类型,需要把它转换成python对象类型;并且加入我需要获取里面的datatime、uploadtime、name这三个字段的数据,改进上面的代码:
import requests
from lxml import etree
import json
def get_data():
url = 'http://127.0.0.1:8005/'
response = requests.get(url)
response.encoding = 'utf-8'
page_text = response.text
text = etree.HTML(page_text)
div_list = text.xpath('/html/body/text()')
msg = div_list[0].strip()
msg_json = json.loads(msg) #loads直接转换成python对象
code = msg_json["code"]
if code == 200:
data = msg_json['data'] #获取数据列表
datatime= data[0]['datatime']
uploadtime = data[0]['uploadtime']
name = data[0]['name']
else:
with open('./data_error.log','a',encoding='utf-8') as f:
f.write(f"数据获取错误,状态码为{code}\n")
if __name__ == '__main__':
get_data()
数据入库:
def put_data(data):
db = pymysql.connect(
host = '192.168.247.100',
port = 3306,
user = 'root',
password = '123457',
database = 'test',
charset = 'utf8'
)
_values = (
(data[0]['datatime'],data[0]['uploadtime'],data[0]['name'])
)
cursor = db.cursor()
# 建表语句
# sql = "create table json_data(id int primary key AUTO_INCREMENT,data datetime,uptime datetime,cityname varchar(20))"
insert_sql = "insert into json_data(data,uptime,cityname) values(%s,%s,%s)"
cursor.execute(insert_sql,_values)
db.commit()
cursor.close()
可以将采集和入库的两个函数写到一个程序文件中,一下是总的:
import requests
from lxml import etree
import json
import pymysql
def get_data(): #采集函数
url = 'http://127.0.0.1:8005/'
response = requests.get(url)
response.encoding = 'utf-8'
page_text = response.text
text = etree.HTML(page_text)
div_list = text.xpath('/html/body/text()')
msg = div_list[0].strip()
msg_json = json.loads(msg) #loads直接转换成json
code = msg_json["code"]
if code == 200:
data = msg_json['data'] #获取数据列表
datatime= data[0]['datatime']
uploadtime = data[0]['uploadtime']
name = data[0]['name']
return data
else:
with open('./data_error.log','a',encoding='utf-8') as f:
f.write(f"数据获取错误,状态码为{code}\n")
def put_data(data): #入库函数
db = pymysql.connect(
host = '192.168.247.100',
port = 3306,
user = 'root',
password = '123457',
database = 'test',
charset = 'utf8'
)
_values = (
(data[0]['datatime'],data[0]['uploadtime'],data[0]['name'])
)
cursor = db.cursor()
# 建表语句
# sql = "create table json_data(id int primary key AUTO_INCREMENT,data datetime,uptime datetime,cityname varchar(20))"
insert_sql = "insert into json_data(data,uptime,cityname) values(%s,%s,%s)"
cursor.execute(insert_sql,_values)
db.commit()
cursor.close()
if __name__ == '__main__':
d = get_data()
put_data(d)
最后看数据库成功接收到数据:
没有问题,这就完成了一个从前端web socket到后端数据入库的过程。