如果違反板規請刪除 謝謝
我現在上補習班 300 小時大數據課程 , 9 / 24 就結業了
我們小組 6 人做 UBIKE 資料分析 , 上課學習跟實際應用到專題上
還是有些地方不會 , 所以想要請教 , 就像下面這個程式
可以幫我看看寫的註解那裏不對 , 還有回答問題 , 顧問算月的
回答問題就用 LINE 或 MAIL , 請告知多少錢願意當我顧問 . 謝謝 !
import datetime as dt #將函數 datetime 指定給 dt
import requests,time,pathlib,os,re
#######################################################################
#自訂函式區
def get_url_filename(arg): #取得網頁檔案
return re.sub(r'^.*?station=(.*?)&stname=&datepicker=(.*?)$',r'\2_\1',arg)
#返回用於替換字符串中的匹配項。這是什麼意思
def log(arg):
#返回 x 的自然对数,要解析的命令行參數列表。這是什麼意思
with open('log\\event.log','a',encoding='utf-8') as f: #打開event.log 'a'新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 utf-8 中文編碼
f.writelines(arg+'\n') #寫入行並換行
f.close() #f是代表 file 嗎 ? 關檔
#######################################################################
base_dir = os.path.dirname(os.path.realpath(__file__))
#判斷log資料夾是否存在,若不存在則建立log資料夾
pathlib.Path(base_dir+"\\log\\").mkdir(parents=True, exist_ok=True)
with open('log\\event.log','w',encoding='utf-8') as f:
pass #這裡用意是把event.log內容清空
f.close()
location_dict={'466910':'鞍部','466920':'臺北','466930':'竹子湖','C0A980':'社子','C0A9A0':'大直','C0A9B0':'石牌','C0A9C0':'天母','C0A9E0':'士林','C0A9F0':'內湖','C0AC40':'大屯山','C0AC70':'信義','C0AC80':'文山','C0AH40':'平等','C0AH70':'松山','C1AC50':'關渡','C1A730':'公館','C0A9G0':'南港','C0A990':'大崙尾山'}
#print(location_dict.keys()) 測試列出location_dict所有key:466910,466920...
startdate = dt.datetime(2019, 8,1)
enddate = dt.datetime(2019, 8,1)
totaldate = (enddate - startdate).days + 1
data_folder='HTML_DATA'
#判斷HTML_DATA資料夾是否存在,若不存在則建立HTML_DATA資料夾
pathlib.Path(data_folder).mkdir(parents=True, exist_ok=True)
#######################################################################
#下載全部html資料到HTML_DATA資料夾
for daynumber in range(totaldate): #迴圈 日期數目在全部日期的範圍內
datestring = str((startdate + dt.timedelta(days = daynumber)).date())
#將日期轉換為字串
print(datestring)
#取得單日_全部地點.htm
for i in location_dict.keys(): # 迴圈 i 從監測站起點到終點下載資料
url="https://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?command=viewMain&station=%s&stname=&datepicker=%s" %(i.split("_")[0],datestring)
#print(url)
try: #異常狀況處裡 ,避免當機產生 r=requests.get(url) 為什麼要設定 r 變數 , 後面沒有引用 r
print("Download: "+datestring+"_"+i+".htm") #列印下載日期 , 當 i 迴圈中斷的地方
with open(data_folder+"\\"+datestring+"_"+i+".htm",'w',encoding='utf-8') as f:
#打開檔案目錄與日期在 i 迴圈
f.write(r.text) #寫入 r.text 檔案
f.close() # 關閉
except:
print("Error: "+datestring+"_"+i+".htm")
#列印錯誤日期在迴圈 i 的何處停止
log(url)
finally:
time.sleep(5)
print("1. HTML資料下載完畢.")
#######################################################################
#檢查event.log是否為空或有內容,有則表示有資料下載失敗需要重新下載
log_file = (open("log\\event.log", "r"))
download_error_url = log_file.read().split('\n')
log_file.close()
#若download_error_url陣列長度為1時表示是沒有錯誤(只有一列空白行)
#大於1表示有下載錯誤的記錄
if (len(download_error_url))>1: #假如下載錯誤網址長度>1
with open('log\\event.log','w',encoding='utf-8') as f:
pass #這裡用意是把event.log內容清空
f.close()
for i in download_error_url: # 迴圈 i 在 下載錯誤網址
if i!='': #假如 i 不等於空白
try: # 異常處理同上
r=requests.get(i)
print("Download: "+get_url_filename(i)+".htm")
with open(data_folder+"\\"+get_url_filename(i)+".htm",'w',encoding='utf-8') as f:
f.write(r.text)
f.close()
except:
print("Error: "+get_url_filename(i)+".htm")
log(i)
finally:
time.sleep(5)
print("2. 下載錯誤HTML資料補下載完畢.")
else:
print("2. 檢查完畢,無下載錯誤HTML資料.")
def get_url_filename(arg): #取得網頁檔案
return re.sub(r'^.*?station=(.*?)&stname=&datepicker=(.*?)$',r'\2_\1',arg)
#返回用於替換字符串中的匹配項。這是什麼意思
正則表示法。
https://zwindr.blogspot.com/2016/01/python-regular-expression.html
def log(arg):
#返回 x 的自然对数,要解析的命令行參數列表。這是什麼意思
with open('log\\event.log','a',encoding='utf-8') as f: #打開event.log 'a'新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 utf-8 中文編碼
f.writelines(arg+'\n') #寫入行並換行
f.close() #f是代表 file 嗎 ? 關檔
ㄜ,筆記抄到晃神嗎?這個log函數是代表記錄的log,不是對數。
with open('log\\event.log','a',encoding='utf-8') as f:
f.writelines(arg+'\n')
f.close()
注意到with那行了嗎?有個as f,也就是把open那邊傳回來的值存入f這個變數。
這個變數只會存在這個區塊,你縮排錯誤應該會跳錯。
然後f.close()這句應該不是必要的,with會自己幫你關。
去補python基礎吧,300小時要學基礎和爬蟲應該很難。
我覺得這位樓主很有誠意,將來肯定學有所成。
我看過許多人問問題時很沒禮貌,好像人家欠他一個答案,殊不知,台上一分鐘,台下十年功,有時,一個看似簡單的答案,可能背後隠藏數年的經驗累積。
願意花錢請顧問,尊重對方的專業,難能可貴,我不會 python(我會的東西現在沒人要學),一點都幫不上忙,但我要幫樓主按個贊,加油。
要問人或者找顧問的話
你也可以去鐵人賽那裡找找看
有許多以 python 為主題的參賽者
選我正解