#\usr\bin\python
#-*coding:UTF-8-*-
def ModSearchWeather(City,Date): #定義一個對象:獲取天氣歷史信息
import re,requests,sys #引用re,requests,sys等相應庫
#獲取網頁數據
FilePath=sys.path[0]+'/'+City+'('+Date+').txt' #定義FilePath爲輸出txt文件路徑
url='http://www.tianqihoubao.com/lishi/'+City+'/month/'+Date+'.html' #定義url爲獲取天氣歷史數據的網址
xml=requests.get(url).text #定義xml爲獲取網頁數據
xml=xml.replace(' ','').replace(' ','').replace('\n','') #用replace方法初步處理不必要的空格和換行符
reObj=re.compile(u'<td>(.*?)</td>') #運用正則表達式獲取<td></td>中的表格內容
textlist=reObj.findall(xml) #將獲取到的表格內容賦值給textlist
#進一步處理所獲得的數據內容
if len(textlist)>1: #判斷是否獲得了數據
#如是:獲得數據
FileName=open(FilePath,'w') #新建一個txt文件,如當前文件夾中存在,則直接覆蓋
FileName.write('') #清空txt文件中內容,主要針對已存在的txt文件
for i in range(len(textlist)): #設置循環,直到所獲數據的最後一位
if (i+1)%4==0: #設置規則:隔4個內容獲取輸出一次,這裏是爲了配合網站表格中的每一行
text=textlist[i-3:i+1] #輸出列表內容到text
textinfo='' #定義textinfo來存放臨時處理好的數據
textOut='' #定義textOut來存放處理好的數據,並用於輸出
for j in range(4): #設置循環,4位
textinfo=text[j].replace('\r','').replace(' ','')\
.replace('<b>','').replace('</b>','') #將所獲取的數據一一處理,去除\r,<b>,<\b>和空格等無關的內容
if len(textinfo)>30: #判斷處理完的數據字符串是否大於30,因爲大於30位的字符串爲包含鏈接的日期,輸出時僅保留日期即可
#如是:字符串大於30
textinfo=textinfo[textinfo.find('>')+1:len(textinfo)-4] #用find方法來截取字符串,輸出日期
else:
#如不是:字符串小於30
textinfo=textinfo #直接輸出內容
textOut=textOut + ',' + textinfo #將處理好的數據按照',A,B,C,D'等方式輸出
## print textOut.replace(',','',1)
FileName=open(FilePath,'a') #在追加模式(a)模式下將內容輸入到txt文件中
FileName.write(textOut.replace(',','',1).encode('utf-8')+'\n') #刪除多餘的',',按照'A,B,C,D'的格式輸入到txt文件中,行與行之間進行換行處理
FileName.close() #關閉txt文件
return '\n'+City+'('+Date+')' + 'Search Successful\n'+\
'----------------------------------------------\n' #執行完畢後顯示輸出成功提示
else:
#如不是:沒有獲得數據
return '\n'+City+'('+Date+')' + 'Search Fails\n'+\
'----------------------------------------------\n' #執行完畢後顯示輸出失敗提示
def InputInfo(): #定義一個對象:用於輸入信息
City=raw_input('Please Enter Chinese City English Name: ') #定義City爲輸入的城市名稱
Date=raw_input('Please Enter Search Date(YYYYMM) Or Year(YYYY): ') #定義Date爲輸入的獲取日期
if len(Date)==6: #判斷輸入日期的字符串長度
#如等於6,則爲按月獲取天氣歷史信息
print ModSearchWeather(City,Date) #執行獲取天氣歷史信息函數
elif len(Date)==4:
#如等於4,則爲按年獲取天氣歷史信息
for i in range(1,13): #設置循環,從1到12月獲取每月天氣信息,並輸出到txt文件中
print ModSearchWeather(City,Date+str(i).zfill(2)) #執行獲取天氣歷史信息函數
print InputInfo() #執行完畢後再次進入輸入信息界面
print InputInfo() #進入輸入信息界面
爬蟲獲取天氣歷史按月份存爲txt文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.