Python新型冠狀病毒疫情資料自動爬取+統計+傳送報告+資料螢幕(三)傳送篇
今天介紹的專案是使用 Itchat 傳送統計報告
專案功能設計:
- 定時爬取疫情資料存入Mysql
- 進行資料分析製作疫情報告
- 使用itchat給親人朋友傳送分析報告(本文)
- 基於Django做資料螢幕
- 使用Tableau做資料分析
來看看最終效果
目前已經完成,預計2月12日前更新
使用 itchat 傳送資料統計報告
-
itchat 是一個基於 web微信的一個框架,但微信官方並不允許使用這種型別模組,所以近幾年註冊的微信無法使用 itchat 想知道自己的微信能否使用 itchat 登陸 微信網頁版 試一試能否登陸,如果可以登陸那麼恭喜你可以使用 itchat 開發一些有趣的東西,如果不能使用,那麼也沒關係我們可以使用一些傳送簡訊的介面,或者使用 python 傳送郵件的模組也可以達到效果,下圖是微信機器人自動傳送的訊息報告:
-
分析問題:我們的目的是使用 itchat 定時傳送報告,而且要有互動聊天功能,前面提到過青雲客機器人我們這次專案就使用它來回復聊天,要做到這兩點,我們必須使用多工,所以這次程式使用了 python 多執行緒多方式來實現這些功能,讓主程式執行 itchat聊天機器人程式 建立一個執行緒來定時爬取資料,傳送資料包告
-
原始碼展示環節:
這次的原始碼是結合了這過個系列前兩篇文章的延伸,如果你也想要搭建一個這樣的機器人,你需要先去看看我這個系列前面的兩篇部落格,建立資料庫,搭建mysql,這次我就不仔細講解原始碼了,itchat API 也比較簡單,我就簡單介紹一下,如果你想使用需要修改和注意到一些地方,先看看原始碼:
import re
import time
import json
import datetime
import threading
import requests
import pymysql
import itchat
import pandas as pd
@itchat.msg_register(itchat.content.TEXT)
def print_content(msg):
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg["CreateTime"]))
friend_name = itchat.search_friends(userName=msg['FromUserName'])['NickName']
print(start_time, friend_name)
if friend_name in ["微信名1", "微信名2"]: # 允許啟動聊天程式的物件,就是你想讓聊天機器人自動回覆誰給你發的微信:把微信名放在列表裡
if friend_name == "自己的微信名": # 自己的微信名
if msg['Text'].split(":")[0] == "nlp":
itchat.send(nlp_chat(msg['Text'].split(":")[1]), toUserName="filehelper")
else:
itchat.send("bAI: " + nlp_chat(msg['Text']), toUserName=msg["FromUserName"])
def nlp_chat(msg):
url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=%s" % msg
response = requests.get(url)
content = json.loads(response.content.decode())
if content["result"]:
return "哈哈?"
else:
return content["content"]
class VirusSupervise(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.url = 'https://3g.dxy.cn/newh5/view/pneumonia?scene=2&clicktime=1579582238&enterid=1579582238&from=timeline&isappinstalled=0'
self.rumor_url = "https://3g.dxy.cn/newh5/view/pneumonia_rumors?from=dxy"
self.all_data = list()
self.host_ip = "39.107.99.31" # 39.107.99.31
self.host_user = "cooh" # cooh
def run(self):
while True:
num = 9
sleep_time = 3600 * num # 一小時
time.sleep(10)
self.insert_wis_sql() # 更新資料庫
self.send_msg() # 傳送訊息
def request_page(self):
"""
請求頁面資料
"""
res = requests.get(self.url)
res.encoding = 'utf - 8'
pat0 = re.compile('window.getAreaStat = ([\s\S]*?)</script>')
data_list = pat0.findall(res.text)
data = data_list[0].replace('}catch(e){}', '')
data = eval(data)
return data
def deep_spider(self, data, province_name):
"""
深度提取出標籤裡詳細的資料
:param data:
:param province_name:
:return:
"""
for temp_data in data:
self.all_data.append([temp_data["cityName"], temp_data["confirmedCount"], temp_data["curedCount"],
temp_data["deadCount"], province_name, datetime.date.today(),
datetime.datetime.now().strftime('%H:%M:%S')])
def filtration_data(self):
"""
過濾資料
"""
temp_data = self.request_page()
province_short_names, confirmed_counts, cured_counts, dead_counts = list(), list(), list(), list()
for i in temp_data:
province_short_names.append(i['provinceShortName']) # 省份
confirmed_counts.append(i['confirmedCount']) # 確診
cured_counts.append(i['curedCount']) # 治癒
dead_counts.append(i['deadCount']) # 死亡
self.deep_spider(i['cities'], i["provinceShortName"]) # 深度解析資料新增到例項屬性中
data_all = pd.DataFrame(self.all_data, columns=["城市", "確診", "治癒", "死亡", "省份", "日期", "時間"])
# print(data_all[data_all["省份"] == "陝西"])
df = pd.DataFrame()
df['省份'] = province_short_names
df['確診'] = confirmed_counts
df['治癒'] = cured_counts
df['死亡'] = dead_counts
print(df)
# data_all.to_csv("疫情資料_1.csv", encoding="utf_8_sig")
return data_all
@staticmethod
def insert_sql(data):
coon = pymysql.connect(host="127.0.0.1", user="root", password="963369", database="epidemic_data",
charset="utf8")
number = int(pd.read_sql("select cycle from data_all order by id DESC limit 1", coon)["cycle"].to_list()[0]) + 1
print("正在插入資料mysql: ", number)
cursor = coon.cursor() # 建立事務
sql = "insert into data_all(cityName, confirmedCount, curedCount, deadCount, province_name, " \
"date_info, detail_time, cycle) values(%s, %s, %s, %s, %s, %s, %s, %s)"
print("正在插入資料...")
for cityName, confirmedCount, curedCount, deadCount, province_name, date_info, detail_time in zip(data["城市"],
data["確診"], data["治癒"], data["死亡"], data["省份"], data["日期"], data["時間"]):
cursor.execute(sql, (cityName, confirmedCount, curedCount, deadCount, province_name, date_info, detail_time, number))
coon.commit()
print("資料插入完成...")
cursor.close()
coon.close()
def insert_wis_sql(self):
data = self.filtration_data()
self.insert_sql(data)
coon = pymysql.connect(host=self.host_ip, user=self.host_user, password="963369", database="epidemic_data", charset="utf8")
number = int(pd.read_sql("select cycle from all_data order by id DESC limit 1", coon)["cycle"].to_list()[0]) + 1
print("正在向阿里雲伺服器插入資料: ", number)
cursor = coon.cursor() # 建立事務
sql = "insert into all_data(cityName, confirmedCount, curedCount, deadCount, province_name, " \
"date_info, detail_time, cycle) values(%s, %s, %s, %s, %s, %s, %s, %s)"
print("正在插入資料...")
for cityName, confirmedCount, curedCount, deadCount, province_name, date_info, detail_time in zip(data["城市"],
data["確診"], data["治癒"], data["死亡"], data["省份"], data["日期"], data["時間"]):
cursor.execute(sql, (cityName, confirmedCount, curedCount, deadCount, province_name, date_info, detail_time, number))
coon.commit()
print("資料插入完成...")
cursor.close()
coon.close()
def send_msg(self):
content = self.data_analysis() # 提取資料分析報告
name_list = ["爸爸", "媽媽", "姐姐"] # 這個列表裡放的是聊天機器人傳送報告的物件,就是你打算給哪些人傳送報告
itchat.auto_login(hotReload=True)
for name in name_list:
temp_info = itchat.search_friends(name)[0]["UserName"]
itchat.send(content, toUserName=temp_info)
def data_analysis(self):
"""
資料分析返回結果
:return:
"""
importance_province = "陝西" # 你所在的省市(注意資料庫裡是否有此資料)
importance_city = "西安" # 你所在的城市(同上) result中的需要自己修改
result = "您好!\n我是你的智慧疫情監控機器人ABL\n現在是北京時間: %s %s\n%s\n在十二小時內\n全國內陸" \
"30個地區:\n總病例:%s\n全國新增病例:%s\n西安新增病例:%s 積累病例:%s\n陝西積累病例:%s\n下面是新增疫情詳細資料:%s疫情期間,注意保護好自己和家" \
"人的健康\n如什麼問題可以問我哦" # 時間 天氣 昨天時間 今日時間 疫情資料
coon = pymysql.connect(host=self.host_ip, user=self.host_user, password="963369", database="epidemic_data",
charset="utf8")
number = pd.read_sql("select cycle from all_data order by id DESC limit 1", coon)["cycle"].to_list()[0]
data1 = pd.read_sql("select * from all_data where cycle = %s" % number, coon)
data2 = pd.read_sql("select * from all_data where cycle = %s" % (int(number) - 1), coon)
now_time = data1.date_info.unique()[0] + " " + data1.detail_time.unique()[0] # 查詢資料收集時間
week_info = self.get_week_day(datetime.date.today())
weather = self.get_window() # 天氣資料
all_num = data1["confirmedCount"].sum() # 目前總人數
add_all_num = data1["confirmedCount"].sum() - data2["confirmedCount"].sum() # 總新增人數
sx_all = data1[data1["province_name"] == importance_province]["confirmedCount"].sum()
add_xian = int(data1[data1["cityName"] == importance_city]["confirmedCount"]) - \
int(data2[data2["cityName"] == importance_city]["confirmedCount"]) # 西安新增人數
xian_all = int(data1[data1["cityName"] == importance_city]["confirmedCount"])
temp_a1 = data1.groupby("province_name")["confirmedCount"].sum()
temp_a2 = data2.groupby("province_name")["confirmedCount"].sum()
add_city = (temp_a1 - temp_a2).sort_values(ascending=False)
add_city = add_city[add_city.values != 0] # 新增地區及人數
result_str = "\n"
for city_name, number in zip(add_city.index.tolist(), add_city.values.tolist()):
str_data = str(city_name) + "新增病例: " + str(number) + "\n"
result_str += str_data
danger_area = data2.groupby("province_name")["confirmedCount"].sum().sort_values(ascending=False)[: 10]
danger_str = "\n" # 疫情嚴重地區可以自己新增
for city_name, number in zip(danger_area.index.tolist(), danger_area.values.tolist()):
str_data = str(city_name) + "出現病例: " + str(number) + "\n"
danger_str += str_data
result = result % (str(now_time).split(" ")[1], week_info, weather, all_num, add_all_num,
add_xian, xian_all, sx_all, result_str)
coon.close()
return result
@staticmethod
def get_week_day(date):
week_day = {
0: '星期一',
1: '星期二',
2: '星期三',
3: '星期四',
4: '星期五',
5: '星期六',
6: '星期日',
}
day = date.weekday() # weekday()可以獲得是星期幾
return week_day[day]
@staticmethod
def get_window():
url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=%E8%A5%BF%E5%AE%89%E5%A4%A9%E6%B0%94"
response = requests.get(url)
content = json.loads(response.content.decode())
if content["result"]:
return "未獲取到天氣資訊"
else:
return content["content"]
if __name__ == '__main__':
# itchat.auto_login(hotReload=True, enableCmdQR=2) # 如果你打算部署到伺服器上,請使用這行程式碼,註釋掉下面那行
itchat.auto_login(hotReload=True)
sup = VirusSupervise()
sup.start()
itchat.run()
- 下面介紹需要修改到地方:
print_content() 這個函式是負責接受訊息和自動回覆訊息,你需要向 for 迴圈到那個列表裡,新增允許加入自動聊天人到微信名,就是誰給發訊息需要機器人來給他回覆,裡面有他到微信名,注意是微信名,程式會自動回覆訊息,如果沒有就不會做處理
send_msg() 這個模組是用來傳送資料包告的,name_list 這裡是你希望給哪些微信好友每天定時傳送資料包告,將他們的“微信備註名”填寫到列表裡。
importance_province = “陝西” # 你所在的省市(注意資料庫裡是否有此資料)
importance_city = “西安” # 你所在的城市(同上) result中的需要自己修改
如果感興趣到話,可以自己試試,如果還沒有看這個系列的前兩篇文章,請先按前兩篇文章的內容來操作,有問題歡迎交流!點個贊吧
相關文章
- python 傳送buffer型別資料, 傳送octet-stream型別資料, 傳送Uint8Array型別資料Python型別UI
- 用Python爬取新型冠狀病毒肺炎實時資料,pyecharts v1.x繪製省市區疫情地圖PythonEcharts地圖
- 新型冠狀病毒全國疫情介面ApiAPI
- ExtJs讀取servlet傳送資料JSServlet
- 百度:新型冠狀病毒肺炎搜尋大資料包告-復工篇大資料
- 使用shell自動傳送Oracle AWR報告Oracle
- 爬取LeetCode題目——如何傳送GraphQL Query獲取資料LeetCode
- node.js爬取資料並定時傳送HTML郵件Node.jsHTML
- 資料傳送類指令【80486】
- lncRNA資料分析傳送門
- 二、傳送請求,獲取響應資料
- 【測試】echo傳送和接收TCP/UDP資料包|shell 傳送TCP/UDP資料包TCPUDP
- Win10系統如何阻止自動傳送錯誤報告Win10
- python requests傳送不同型別的資料Python型別
- 30332資料傳送指令
- PHP傳送和接收POST資料PHP
- php傳送超大資料處理PHP大資料
- 【python3.x】傳送自動化測試報告郵件Python測試報告
- 自動生成addm報告並以郵件傳送
- 自動生成AWR報告並以郵件附件傳送
- Python:爬取疫情每日資料Python
- C# 操縱貼上板 Clipboard(傳送資料、讀取資料、清空資料)C#
- QT串列埠助手(四):資料傳送QT串列埠
- 利用Oracle資料庫傳送郵件Oracle資料庫
- 資料庫映象和日誌傳送資料庫
- 關於Activity之間傳送資料
- http不使用Form表單傳送檔案資料和非檔案資料(上傳篇)HTTPORM
- Python3實現自動傳送MySql查詢併傳送郵件PythonMySql
- Java網路程式設計--UDP傳送接收資料Java程式設計UDP
- DMA:冠狀病毒流行期間資料和營銷行業報告行業
- 自動發郵件做成視覺化可以連線資料庫取資料可設定定時傳送等視覺化資料庫
- Python爬蟲(二)——傳送請求Python爬蟲
- react-fetch資料傳送請求React
- 0211-使用 dummy 傳送資料
- 使用postman傳送資料,springmvc接收資料的問題PostmanSpringMVC
- 非同步 SOCKET 程式設計 - 傳送和接收資料 (轉)非同步程式設計
- 每一天簡訊傳送次數每一分鐘傳送頻率傳送限制 hibernate資料庫框架資料庫框架
- 微信如何在群裡進行資料統計,教你傳送表單網頁輕鬆統計資料網頁