|
@@ -0,0 +1,140 @@
|
|
|
|
+#!/usr/bin/python
|
|
|
|
+# -*- coding: UTF-8 -*-
|
|
|
|
+import pandas as pd
|
|
|
|
+
|
|
|
|
+from datetime import datetime
|
|
|
|
+import pymysql
|
|
|
|
+pymysql.install_as_MySQLdb()
|
|
|
|
+import dataset
|
|
|
|
+import requests
|
|
|
|
+import gspread
|
|
|
|
+from gspread_pandas import Spread, Client
|
|
|
|
+from oauth2client.service_account import ServiceAccountCredentials
|
|
|
|
+
|
|
|
|
+db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/seo?charset=utf8mb4')
|
|
|
|
+
|
|
|
|
+data = pd.DataFrame()
|
|
|
|
+
|
|
|
|
+def notify_group(msg):
|
|
|
|
+ gid='WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD'
|
|
|
|
+ headers = {"Authorization": "Bearer " + gid,"Content-Type": "application/x-www-form-urlencoded"}
|
|
|
|
+ r = requests.post("https://notify-api.line.me/api/notify",headers=headers, params={"message": msg})
|
|
|
|
+
|
|
|
|
+def download(client, date, newest=True):
|
|
|
|
+ """關鍵字清單"""
|
|
|
|
+ lst_kw = []
|
|
|
|
+ db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/seo?charset=utf8mb4')
|
|
|
|
+ cursor_kw = db.query(f"SELECT term FROM seo.selected_kw where client='{client}'")
|
|
|
|
+ for c in cursor_kw:
|
|
|
|
+ for i in c.values():
|
|
|
|
+ lst_kw.append(i)
|
|
|
|
+ print(len(lst_kw))
|
|
|
|
+
|
|
|
|
+ """抓取general_log關鍵字"""
|
|
|
|
+ last_check_lst = []
|
|
|
|
+ for i in lst_kw:
|
|
|
|
+ if newest:
|
|
|
|
+ cursor_last_check = db.query(f"select kw,ranking from seo.general_log where kw='{i}' order by dt desc limit 1")
|
|
|
|
+ else:
|
|
|
|
+ cursor_last_check = db.query(f"select kw,ranking from seo.general_log where kw='{i}' order by dt limit 1")
|
|
|
|
+ group = []
|
|
|
|
+ n = 0
|
|
|
|
+ for c in cursor_last_check:
|
|
|
|
+ for j in c.values():
|
|
|
|
+ if 'site' in str(j):
|
|
|
|
+ n+=1
|
|
|
|
+ if n==1 and j==1:
|
|
|
|
+ group.append(101)
|
|
|
|
+ else:
|
|
|
|
+ group.append(j)
|
|
|
|
+ n = 0
|
|
|
|
+ last_check_lst.append(group)
|
|
|
|
+ # df2 = pd.DataFrame(not_match_kw_lst,columns=['關鍵字組','搜尋排名'])
|
|
|
|
+ df3 = pd.DataFrame(last_check_lst, columns=['關鍵字組', '搜尋排名'])
|
|
|
|
+ # df_all = pd.concat([df, df3])
|
|
|
|
+ df3.to_csv(f"./排名CSV/{client}當日排名{date}.csv", index=False, encoding='utf_8_sig')
|
|
|
|
+ db.close()
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def combine_df(client, date1, date2):
|
|
|
|
+ df = pd.read_csv(f'./排名CSV/{client}當日排名{date1}.csv')
|
|
|
|
+ df2 = pd.read_csv(f'./排名CSV/{client}當日排名{date2}.csv')
|
|
|
|
+ df_result = pd.merge(df, df2, on='關鍵字組', how='outer').fillna(0)
|
|
|
|
+ date1 = arrange_date(date1)
|
|
|
|
+ date2 = arrange_date(date2)
|
|
|
|
+ df_result.columns = ['kw', 'starting_rank', 'current_rank']
|
|
|
|
+
|
|
|
|
+ p = df_result['starting_rank'].tolist()
|
|
|
|
+ l = df_result['current_rank'].tolist()
|
|
|
|
+
|
|
|
|
+ c = [u"\u2197 "+str(abs(int(i)-int(j))) if int(i)-int(j)>0 \
|
|
|
|
+ else u"\u2198 "+str(abs(int(i)-int(j))) if int(i)-int(j)<0 \
|
|
|
|
+ else u"\u2192 "+str(abs(int(i)-int(j))) for (i, j) in zip(p, l)]
|
|
|
|
+
|
|
|
|
+ df_result['client'] = client
|
|
|
|
+ df_result['change'] = c
|
|
|
|
+ df_result['kw'] = df_result['kw'].str.split('site',0).str[0]
|
|
|
|
+ df_result.to_csv(f"./排名CSV/combine/{client}排名變化.csv", index=False, encoding='utf_8_sig')
|
|
|
|
+ return df_result, date1, date2
|
|
|
|
+
|
|
|
|
+def arrange_date(date):
|
|
|
|
+ if date[0] == 0 :
|
|
|
|
+ date = date[1]+'/'+date[2:]
|
|
|
|
+ else:
|
|
|
|
+ date = date[:2]+'/'+date[2:]
|
|
|
|
+ return date
|
|
|
|
+
|
|
|
|
+def checkrank(data):
|
|
|
|
+ msg = "以下是排名下降的關鍵字:\n"
|
|
|
|
+ msg2 = "以下是目前排名於百名外的關鍵字:\n"
|
|
|
|
+ flag1=0
|
|
|
|
+ flag2=0
|
|
|
|
+ for row in data.index:
|
|
|
|
+ #print(row)
|
|
|
|
+ delta = int(data['starting_rank'][row])-int(data['current_rank'][row])
|
|
|
|
+ if (delta < 0):
|
|
|
|
+ msg += "[" + data['client'][row] + "] " + data['kw'][row] + ": " + str(int(data['starting_rank'][row])) + " -> " + str(int(data['current_rank'][row])) + " (" + str(int(delta)) + ")\n"
|
|
|
|
+ flag1=1
|
|
|
|
+ if (int(data['current_rank'][row]) == 101): #out of range...
|
|
|
|
+ msg2 += "[" + data['client'][row] + "] " + data['kw'][row] + "\n"
|
|
|
|
+ flag2=1
|
|
|
|
+ print(msg)
|
|
|
|
+ print(msg2)
|
|
|
|
+ return msg, msg2, flag1, flag2
|
|
|
|
+
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
+ date1 = '0707'
|
|
|
|
+ date2 = '0717'
|
|
|
|
+ lst = ['清原', '神助物流', '班尼斯', '有夠讚', '仁本', '火柴星人', '呷茶']
|
|
|
|
+ for client in lst:
|
|
|
|
+ date1 = '0707'
|
|
|
|
+ date2 = '0718'
|
|
|
|
+ download(client, date1, newest=False)
|
|
|
|
+ download(client, date2, newest=True)
|
|
|
|
+ res, d1, d2 = combine_df(client, date1, date2)
|
|
|
|
+ data = data.append(res, ignore_index=True)
|
|
|
|
+ data.to_csv(f"./排名CSV/combine/__排名變化.csv", index=False, encoding='utf_8_sig')
|
|
|
|
+
|
|
|
|
+ scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
|
|
|
|
+ credentials = ServiceAccountCredentials.from_json_keyfile_name("choozmointernal-2e314f3d4e12.json", scope)
|
|
|
|
+ gc = gspread.authorize(credentials)
|
|
|
|
+ spread = Spread("kw_ranking_tracker",creds=credentials)
|
|
|
|
+ spread.df_to_sheet(data, index=False, sheet="main", start="A1", replace=False)
|
|
|
|
+ time_stamp = datetime.now()
|
|
|
|
+ time_stamp = time_stamp.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
+
|
|
|
|
+ spread.sheet.update('G1', '最後更新:' + time_stamp)
|
|
|
|
+
|
|
|
|
+ msg, msg2, flag1, flag2=checkrank(data)
|
|
|
|
+
|
|
|
|
+ if flag1 == 1:
|
|
|
|
+ msg01 = [msg[i:i+1000] for i in range(0, len(msg), 1000)]
|
|
|
|
+ for m1 in msg01:
|
|
|
|
+ notify_group(m1)
|
|
|
|
+ print(m1)
|
|
|
|
+
|
|
|
|
+ if flag2 == 1:
|
|
|
|
+ msg02 = [msg2[i:i+1000] for i in range(0, len(msg2), 1000)]
|
|
|
|
+ for m2 in msg02:
|
|
|
|
+ notify_group(m2)
|
|
|
|
+ print(m2)
|