1. 程式人生 > >2018-7-12python爬取歷史天氣數據

2018-7-12python爬取歷史天氣數據

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文件的列相同,註意兩點:

  1. 如果是循環跑出來的表,每個表都有表頭,拼接的時候不會去掉。
  2. 拼接的時候是按照文件名默認排序從上到下依次排列的。
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爬取歷史天氣數據