2018-7-12python爬取歷史天氣數據
阿新 • • 發佈:2018-07-13
www. 正在 history ins tran 文件 idt 寫入文件 1.3
2018-7-12python爬取歷史天氣數據
python 爬蟲 天氣數據需求
需要幾個城市的歷史天氣數據,為了方便最後入庫,需要的字段為 城市、溫度、天氣。最好能生成一個完整的csv導入數據。
from bs4 import BeautifulSoup as bsp
import urllib,http.cookiejar,re,time
#對excel的操作,可以添加sheet
import xlwt
#拼接兩個csv
import glob
import time
# 做好cookie管理工作
cookie=http.cookiejar.CookieJar() # 創建空CookieJar
cj=urllib.request.HTTPCookieProcessor(cookie) # 構造cookie
opener = urllib.request.build_opener(cj) # 根據cookie構造opener
# 偽造header
opener.addheaders = [(‘User-agent‘, ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0‘),
(‘Connection‘,‘ keep-alive‘)]
# 載入header
urllib.request.install_opener(opener)
# 定義若幹url
root_url=‘http://www.tianqihoubao.com/lishi/‘
# 獲取root_url網頁內容
req = urllib.request.Request(root_url)
u=bsp(bytes.decode(urllib.request.urlopen(req).read(),‘gbk‘))
# 找到表格
u1=u.find(class_="citychk")
# 找到表格裏的每一個市
u2=u1.find_all(‘dd‘)
# 記錄每一個市的url和對應的中文名稱
city_urls=[]
city_names=[]
#for uu in u2:
# u3=uu.find_all(‘a‘)
# for u3u in u3:
# city_urls.append(re.split(‘\.|/‘,u3u.attrs[‘href‘])[2])
# city_names.append(u3u.text)
#### shg 2018/07/12 ###############
#### 需要哪些城市將那些城市的拼音和漢字放到以下兩個列表中,月份同理
city_urls=["nanjing","beijing"]
city_names=["南京","北京"]
months=[‘201712‘,‘201801‘,‘201802‘,‘201803‘,‘201804‘,‘201805‘,‘201806‘,‘201807‘]
#### shg 2018/07/12 ###############
# 構造各市歷史月份url
for i,city_url in enumerate(city_urls):
# 每爬一個市休息2秒鐘
time.sleep(2)
with open(‘D:/天氣數據/‘+str(i)+city_names[i]+‘.csv‘,‘w‘) as f:
##### 只給第一個csv建列名
if i == 0 :
f.write(‘日期,天氣狀況,氣溫,城市,風力風向\n‘)
for month in months:
url_month=‘http://www.tianqihoubao.com/lishi/‘+city_url+‘/month/‘+month+‘.html‘
req = urllib.request.Request(url_month)
#如果連接不成功,休息5分鐘
while True:
try:
u=bsp(bytes.decode(urllib.request.urlopen(req).read(),‘gbk‘))
break
except:
time.sleep(300)
# 刪去不可見字符
u1=[re.sub(‘\s‘,‘‘,x.text) for x in u.table.find_all(‘td‘)]
# 寫入文件的時候跳過表頭
for j,item in enumerate(u1[4:]):
if j%4==3:
# 城市名稱列#### shg 2018/07/12 #################
f.write(city_names[i]+",")
f.write(item+‘\n‘)
else:
f.write(item+‘,‘)
#### shg 2018/07/12 #################
#import glob #import time
##### 拼接多個城市的csv
##### 註意修改路徑
csvx_list = glob.glob(‘D:/天氣數據/*.csv‘)
print(‘總共發現%s個CSV文件‘% len(csvx_list))
time.sleep(2)
for i in csvx_list:
fr = open(i,‘r‘).read()
with open(‘weather_history.csv‘,‘a‘) as f:
f.write(fr)
print(‘拼接完畢!‘)
#### shg 2018/07/12 #################
在做的過程中遇到了幾個問題,記錄如下:
1 寫入excel中,分成多個sheet
導入xlwt包。
import xlwt
# 新建一個xls文件,註意編碼
workbook = xlwt.Workbook(encoding=‘utf-8‘)
# 新建一個sheet,如果對一個單元格重復操作,添加cell_overwrite_ok=True
booksheet1 = workbook.add_sheet("beijing",cell_overwrite_ok=True)
# 寫入
booksheet1.write(1,1,"beijing")
booksheet2 = workbook.add_sheet("jing",cell_overwrite_ok=True)
booksheet2.write(1,1,"jing")
# 保存文件
workbook.save(‘weather.xls‘)
2 拼接多個csv文件。
縱向的拼接,需要兩個csv文件的列相同,註意兩點:
- 如果是循環跑出來的表,每個表都有表頭,拼接的時候不會去掉。
- 拼接的時候是按照文件名默認排序從上到下依次排列的。
import glob
import time
csvx_list = glob.glob(‘D:/天氣數據/*.csv‘)
print(‘總共發現%s個CSV文件‘% len(csvx_list))
time.sleep(2)
print(‘正在處理............‘)
for i in csvx_list:
fr = open(i,‘r‘).read()
with open(‘csv_to_csv.csv‘,‘a‘) as f:
f.write(fr)
print(‘寫入成功!‘)
print(‘寫入完畢!‘)
print(‘10秒鐘自動關閉程序!‘)
3 獲取網頁上表格的方法
[re.sub(‘\s‘,‘‘,x.text) for x in u.table.find_all(‘td‘)]
re.sub("替換的內容“,”替換成“,需替換的字符串)
- 替換的內容可以使用正則表達式,\ 為轉義字符;| 為或,可以拼接多個條件;例如:
import re
re.sub(‘\[|\]|\"|\"‘,‘‘,‘["88585465","64325165","1685654"]‘)
>>> ‘88585465,64325165,1685654‘
2018-7-12python爬取歷史天氣數據