前言
在做了自己的网页后,一直想知道到底有多少人访问过自己的主页。但一直没时间好好研究,最近稍微空了一下,大概补充一下这点。
准备
- 自己的服务器
- flask
- pymysql
- time
- 百度ip地址查询
- requests
- mysql数据库
开始工作
- 首先创建自己的数据库表”浏览量",其中包括三个关键字“ip,time,add”,分别对应访问者的ip,访问时间,以及通过百度api进行分析之后的地址。如下图所示:
注意点:设计表的时候,字符集一定要选对,我这里就选择的utf-8,不然在云服务器上进行写入的时候,会报错乱码!!解决连接
- python上的访问数据库包
详解连接
详细的内容,可以查看连接里的博客。在这里主要说下自己的代码
sql = "INSERT INTO 浏览量 VALUES('"+ip+"','"+time_+"','"+temple+"');"
conn = pymysql.connect(host='xxxxx',port=xxxx,user='xxxxx',passwd='xxxxxx',db='xxxxx')
cur = conn.cursor()
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
- 获取ip的函数
说起来还挺简单的
import request
ip = request.remote_addr
- 获取时间的函数
import time
time_ = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
- 转化为具体地址
其实上面两步已经差不多了,但是光看ip谁知道是哪里的啊,所以去搜一下通过ip指导具体地址的方法,找到一个百度的公开接口。
查询接口
本来是想试试能不能自己爬上去的,但是看了一下,这不是有一个立即获取吗。
1000次免费,还挺不错的,就先试试这个了。接着就是在flask里面写请求接口了
#调用百度api查询地址
url = 'http://ipapi.api.bdymkt.com/ip2location/retrieve'
data = '{\n \"ip\":\"'+str(ip)+'\"\n}'
headers = {
'Content-Type': 'application/json;charset=UTF-8',
'X-Bce-Signature': 'AppCode/自己的appcode(去自己的管理台获取)'
}
r = requests.request("POST", url, data=data, headers=headers)
ans = json.loads(r.content.decode('utf-8'))#string转字典
temple = str(ans["country"]+":"+ans["province"]+":"+ans["city"]+":"+ans["county"]+":"+ans["isp"])
特别注意,这里面还有几个小问题:
- 返回的时候必须先进行
decode('utf-8)
进行编码 - 获取content之后还是string,必须通过
json.loads
转化为字典
全部代码
@app.route("/xxx.html",methods=['GET', ])
def get_person_zone():
ip = request.remote_addr
time_ = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#调用百度api查询地址
url = 'http://ipapi.api.bdymkt.com/ip2location/retrieve'
data = '{\n \"ip\":\"'+str(ip)+'\"\n}'
headers = {
'Content-Type': 'application/json;charset=UTF-8',
'X-Bce-Signature': 'AppCode/xxxxx'
}
r = requests.request("POST", url, data=data, headers=headers)
ans = json.loads(r.content.decode('utf-8'))#string转字典
temple = str(ans["country"]+":"+ans["province"]+":"+ans["city"]+":"+ans["county"]+":"+ans["isp"])
#数据库写入
print(temple)
sql = "INSERT INTO 浏览量 VALUES('"+ip+"','"+time_+"','"+temple+"');"
conn = pymysql.connect(host='xxxx',port=xxxx,user='xxxx',passwd='xxxxx',db='xxxxx') # db:表示数据库名称
cur = conn.cursor()
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
return render_template('xxxxx.html')