大家好,本人三线城市综合体信息IT一枚 。本着生活不易,多才多艺的精神,开始记录自己的python学习过程,欢迎各位大神指教。
这是小白的第一个python程序,本人从事综合体商业管理内的信息板块工作,按店总的要求是希望每小时能够从微信里看到广场的进客流以及广场内各主力店的进客流情况。
根据店总的这一需求,最先想到两种方法,第一种是直接爬取网页数据,第二种是爬取数据库数据。但是对客流系统登录网页进行分析时,发现这货用的是Flash框架的,鄙人技术有限,暂时无法对flash框架的页面进行数据爬取。所以我采用的是第二种爬取数据库的方法,因此本文后面的代码是都是对数据库的爬取。
以下是数据汇报模板:
今日09-07 Monday
天气:雨,温度:27°
截至20:00,
XX市XX广场总客流:50000人次。
#(人数不重要,主要是过程,哪个三线综合体天天有这客流量,店总就不愁了^_^)
其中:
主力店A:2046人次,
主力店B:1998人次,
主力店C:2020人次。
主力店D:1984人次。
——————————————————————————————————————
分析以上模板,我需要用到的数据按顺序分别有:日期,星期几,天气,气温,播报时间,广场进客流,几个主力店的客流。
首先从日期开始编写代码:
为了获得稳定的天气信息,调取了高德地图申请的api接口,这个接口可以获得以下数据:
{'status': '1', 'count': '1', 'info': 'OK', 'infocode': '10000', 'lives': [{'province': '广西', 'city': '桂林市', 'adcode': '450300', 'weather': '阴', 'temperature': '28', 'winddirection': '西南', 'windpower': '≤3', 'humidity': '70', 'reporttime': '2020-09-08 18:54:21'}]}
大家有需要的话可以去申请一下。
import time #导入系统时间模块
print('今日'+time.strftime("%m-%d %A",time.localtime())) #打印出今天的系统时间 %m是月份 %d是具体日期
A1 = '今日'+time.strftime("%m-%d %A",time.localtime()) #时间作为一个输出变量存储在A1中
import requests #导入request模块,request支持HTTP连接
url = "https://restapi.amap.com/v3/weather/weatherInfo?city=450300&key=12345678" #这段网址就是从高德地图申请的api接口了
weather_data = requests.get(url) #从以上地址发送请求获取天气等相关数据
data=eval(weather_data.text) #eval的主要作用还是把上面获得的数据去掉单引号,转换成变量,用text转换成文本信息
a = data.get('lives')
print('天气:'+a[0].get('weather')+','+'温度:'+a[0].get('temperature')+'°')
A2 = '天气:'+a[0].get('weather')+','+'温度:'+a[0].get('temperature')+'°' #天气,气温等信息存入变量A2
接下来是播报时间,这个很容易,我直接调取系统时间信息。
print('截至'+time.strftime('%H:%M')+',') #输出播报时的系统的时间,%H是小时%M是分钟
A3 = '截至'+time.strftime('%H:%M')+',' #把播报时间存入变量A3
再接下来是数据库的链接和数据爬取。这里数据库我连的是内网地址和接口,为了避免信息泄露,用户名和密码都不是真的,数据库用的是postgresql,语句和sql差不多。
import psycopg2 #导入数据库链接模块
conn = psycopg2.connect(database="vion",user="postgres",password="vion",host="192.168.99.200",port="8003")
curs=conn.cursor() #输入数据库的链接方式,数据库名称,用户名,密码,地址,端口;连接数据库
a = 'select innum from public_view_count_org_day ORDER BY counttime desc LIMIT 1'
curs.execute(a) #执行数据库查找命令,按counttime降序排列,取第一条数据
a1 = curs.fetchone() #把获取到的数据也就是广场总客流放入变量a1
#下面输出广场总客流
print('桂林恒大广场总客流:'+str(a1[0])+'人次。')
A4 = '桂林恒大广场总客流:'+str(a1[0])+'人次。' #广场客流存入变量A4
后面是各个主力店的客流爬取:
b = "select innum from public_view_count_info_zone_day where zoneid ='VION1001011004' order by counttime desc limit 1"
curs.execute(b) #执行数据库查找命令,按counttime降序排列,取第一条数据
b1 = curs.fetchone() #把获取到的数据也就是广场总客流放入变量b1
#输出游戏迷客流
print('主力店A:'+str(b1[0])+'人次,')
A5 = '主力店A:'+str(b1[0])+'人次,' #主力店A客流存入变量A5
剩下的代码都差不多,爬取剩下主力店的客流:
c = "select innum from public_view_count_info_zone_day where zoneid ='VION1001011003' order by counttime desc limit 1"
curs.execute(c)
c1 = curs.fetchone()
#输出主力店B客流
print('主力店B:'+str(c1[0])+'人次,')
A6 = '主力店B:'+str(c1[0])+'人次,'
d = "select innum from public_view_count_info_zone_day where zoneid ='VION1001011002' order by counttime desc limit 1"
curs.execute(d)
d1 = curs.fetchone()
#输出主力店C客流
print('主力店C:'+str(d1[0])+'人次。')
A7 = '主力店C:'+str(d1[0])+'人次。'
f = "select innum from public_view_count_info_zone_day where zoneid ='VION1001011006' order by counttime desc limit 1"
curs.execute(f)
f1 = curs.fetchone()
#输出主力店D客流
print('主力店D:'+str(f1[0])+'人次。')
A8 = '主力店D:'+str(f1[0])+'人次。'
所有客流爬取完成后,记得要先关闭数据库,再断开数据库连接。
curs.close() #关闭数据库
conn.close() #断开数据库连接
至此以上,我以及爬取到需要的所有数据信息,准备输出到微信。
导入pyperclip模块
#复制以上输出信息
import pyperclip
dd=pyperclip.paste()
pyperclip.copy(A1+'\r'+A2+'\r'+A3+'\r'+A4+'\r'+'其中:'+'\r'+A5+'\r'+A6+'\r'+A7+'\r'+A8)
#把以上数据按格式排列好,复制进系统剪贴板。
接下来模拟电脑鼠标键盘操作,如果微信网页版还能打开的话可能是另外一种方法了~
#模拟键盘鼠标输入
import pyautogui
#图片存放路径
pic = 'e:\\fskl\\fasong.png' #在屏幕中查找微信发送按钮的图片
point = pyautogui.locateCenterOnScreen(pic)
pyautogui.leftClick(point[0]-50,point[1]-50) #模拟鼠标定位到发送按钮左上方偏移50位置,再点击按键(其实就是微信的空白输入区域)
pyautogui.hotkey('ctrl', 'v') #这里很明显了,模拟键盘ctrl+v
pyautogui.hotkey('enter') #最后点击回车键发送(*_*)
最后的最后,把程序进行打包,转换成exe文件。
pyinstaller -F xxxxx.py #程序打包代码 xxxxx是这段代码的名称
到这里我就把要发送的数据从数据库里爬出再传递到微信中,我只要开着微信窗口,再设置个任务计划程序就行了。
第一次写的程序,虽然都能实现,但还有很多改进的地方,请各位大佬多指教!