最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python爬取歷史天氣數(shù)據(jù)的方法示例

 更新時間:2019年12月30日 15:25:13   作者:huatmpa  
這篇文章主要介紹了用python爬取歷史天氣數(shù)據(jù)的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

某天氣網(wǎng)站(www.數(shù)字.com)存有2011年至今的天氣數(shù)據(jù),有天看到一本爬蟲教材提到了爬取這些數(shù)據(jù)的方法,學(xué)習(xí)之,并加以改進。

準(zhǔn)備爬的歷史天氣

爬之前先分析url。左上有年份、月份的下拉選擇框,按F12,進去看看能否找到真正的url:


很容易就找到了,左邊是儲存月度數(shù)據(jù)的js文件,右邊是文件源代碼,貌似json格式。

雙擊左邊js文件,地址欄內(nèi)出現(xiàn)了url:http://tianqi.數(shù)字.com/t/wea_history/js/54511_20161.js

url中的“54511”是城市代碼,“20161”是年份和月份代碼。下一步就是找到城市代碼列表,按城市+年份+月份構(gòu)造url列表,就能開始遍歷爬取了。

城市代碼也很誠實,很快就找到了:

下一步得把城市名稱和代碼提取出來,構(gòu)造一個“城市名稱:城市代碼”的字典,或者由元組(城市名稱,城市代碼)組成的列表,供爬取時遍歷??紤]到正則提取時,構(gòu)造元組更便捷,就不做成字典了。

def getCity():
  html = reqs.get('https://tianqi.2345.com/js/citySelectData.js').content
  text = html.decode('gbk')
  city = re.findall('([1-5]\d{4})\-[A-Z]\s(.*?)\-\d{5}',text)  #只提取了地級市及以上城市的名稱和代碼,5以上的是縣級市  
  city = list(set(city))                    #去掉重復(fù)城市數(shù)據(jù)
  print('城市列表獲取成功')
  return city

接下來是構(gòu)造url列表,感謝教材主編的提醒,這里避免了一個大坑。原來2017年之前的url結(jié)構(gòu)和后面的不一樣,在這里照搬了主編的構(gòu)造方法:

def getUrls(cityCode):
  urls = []
  for year in range(2011,2020):
    if year <= 2016:
      for month in range(1, 13):
        urls.append('https://tianqi.數(shù)字.com/t/wea_history/js/%s_%s%s.js' % (cityCode,year, month))
    else:
      for month in range(1,13):
        if month<10:
          urls.append('https://tianqi.數(shù)字.com/t/wea_history/js/%s0%s/%s_%s0%s.js' %(year,month,cityCode,year,month))          
        else:
          urls.append('https://tianqi.數(shù)字.com/t/wea_history/js/%s%s/%s_%s%s.js' %(year,month,cityCode,year,month))
  return urls

接下來定義一個爬取頁面的函數(shù)getHtml(),這個是常規(guī)操作,用requests模塊就行了:

def getHtml(url):
  header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
       'Referer': '******'}
  request = reqs.get(url,headers = header)
  text = request.content.decode('gbk') #經(jīng)試解析,這里得用gbk模式
  time.sleep(random.randint(1,3))    #隨機暫停,減輕服務(wù)器壓力
  return text

然后就是重點部分了,數(shù)據(jù)解析與提取。

試了試json解析,發(fā)現(xiàn)效果不好,因為頁面文本里面含雜質(zhì)。

還是用正則表達式吧,能夠提取有效數(shù)據(jù),盡可能少浪費機器時間。

2016年開始的數(shù)據(jù)和之前年份不一樣,多了PM2.5污染物情況,因此構(gòu)造正則表達式時,還不能用偷懶模式。

str1 = "{ymd:'(.*?)',bWendu:'(.*?)℃',yWendu:'(.*?)℃',tianqi:'(.*?)',fengxiang:'(.*?)',fengli:'(.*?)',aqi:'(.*?)',aqiInfo:'(.*?)',aqiLevel:'(.*?)'.*?}"
str2 = "{ymd:'(.*?)',bWendu:'(.*?)℃',yWendu:'(.*?)℃',tianqi:'(.*?)',fengxiang:'(.*?)',fengli:'(.*?)'.*?}"
 
#這個就是偷懶模式,取出來的內(nèi)容直接存入元組中

如果嚴格以2016年為界,用一下偷懶模式還行,但本人在這里遇坑了,原來個別城市的污染物信息是時有時無的,搞不清在某年某月的某天就出現(xiàn)了,因此還得構(gòu)造一個通用版的,把數(shù)據(jù)都提出來,再把無用的字符去掉。

def getDf(url):  
  html = getHtml(url)
  pa = re.compile(r'{(ymd.+?)}')           #用'{ymd'打頭,把不是每日天氣的其它數(shù)據(jù)忽略掉
  text = re.findall(pa,html)
  list0 = []
  for item in text:
    s = item.split(',')              #分割成每日數(shù)據(jù)
    d = [i.split(':') for i in s]         #提取冒號前后的數(shù)據(jù)名稱和數(shù)據(jù)值
    t = {k:v.strip("'").strip('℃') for k,v in d} #用數(shù)據(jù)名稱和數(shù)據(jù)值構(gòu)造字典   
    list0.append(t)
  df = pd.DataFrame(list0)              #加入pandas列表中,便于保存
  return df 

數(shù)據(jù)的保存,這里選擇了sqlite3輕便型數(shù)據(jù)庫,可以保存成db文件:

def work(city,url):
  con =sql.connect('d:\\天氣.db') 
  try:
    df = getDf(url)
    df.insert(0,'城市名稱',city)                #新增一列城市名稱
    df.to_sql('total', con, if_exists='append', index=False) 
    print(url,'下載完成')    
  except Exception as e:
    print("出現(xiàn)錯誤:\n",e)
  finally:
    con.commit()
    con.close()

在這里還有一個小坑,第一次連接數(shù)據(jù)庫文件時,如果文件不存在,會自動添加,后續(xù)在寫入數(shù)據(jù)時,如果數(shù)據(jù)中新增了字段,寫入時會報錯??梢韵劝褦?shù)據(jù)庫文件字段都設(shè)置好,但這樣太累,所以本人又搞了個偷懶的方式,即先傳入一個2019年某月的單個url搞一下,自動添加好字段,后面再寫入時就沒問題了。本人覺得這個應(yīng)該還有更佳的解決辦法,目前還在挖掘中。

數(shù)據(jù)保存后的狀態(tài)如下:

 

本來考慮過用多線程爬蟲,想想又覺得既然人家沒有設(shè)置反爬措施,咱們也不能太不厚道了,就單線程吧。

最終爬了334個城市,100多萬條數(shù)據(jù)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實現(xiàn)初始化不同的變量類型為空值

    Python實現(xiàn)初始化不同的變量類型為空值

    這篇文章主要介紹了Python實現(xiàn)初始化不同的變量類型為空值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python matplotlib 畫dataframe的時間序列圖實例

    python matplotlib 畫dataframe的時間序列圖實例

    今天小編就為大家分享一篇python matplotlib 畫dataframe的時間序列圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 教你怎么用Python實現(xiàn)GIF動圖的提取及合成

    教你怎么用Python實現(xiàn)GIF動圖的提取及合成

    今天教大家一個Python有趣好玩的小功能:將多張圖片轉(zhuǎn)為GIF,同時也可以將一個GIF動圖提取出里面的圖片,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 教你使用Python實現(xiàn)一個簡易版Web服務(wù)器

    教你使用Python實現(xiàn)一個簡易版Web服務(wù)器

    這篇文章主要介紹了教你使用Python實現(xiàn)一個簡易版Web服務(wù)器,本篇文章將通過實現(xiàn)一個簡易版的Web服務(wù)器,幫助讀者理解Python網(wǎng)絡(luò)編程的基本概念和技巧,需要的朋友可以參考下
    2023-04-04
  • python基礎(chǔ)之輸入與輸出

    python基礎(chǔ)之輸入與輸出

    這篇文章主要介紹了python的輸入與輸出,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下
    2021-10-10
  • python處理excel繪制雷達圖

    python處理excel繪制雷達圖

    這篇文章主要為大家介紹了python處理excel繪制雷達圖的相關(guān)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python通過fnmatch模塊實現(xiàn)文件名匹配

    Python通過fnmatch模塊實現(xiàn)文件名匹配

    這篇文章主要介紹了Python通過fnmatch模塊實現(xiàn)文件名匹配,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Python之 requests的使用(一)

    Python之 requests的使用(一)

    requests是一個很實用的Python HTTP客戶端庫,爬蟲和測試服務(wù)器響應(yīng)數(shù)據(jù)時經(jīng)常會用到,requests是Python語言的第三方的庫,專門用于發(fā)送HTTP請求,使用起來比urllib簡潔很多,這篇文章主要介紹requests的基礎(chǔ)用法
    2023-04-04
  • python tkinter的消息框模塊(messagebox,simpledialog)

    python tkinter的消息框模塊(messagebox,simpledialog)

    這篇文章主要介紹了python tkinter的消息框模塊,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • selenium獲取當(dāng)前頁面的url、源碼、title的方法

    selenium獲取當(dāng)前頁面的url、源碼、title的方法

    這篇文章主要介紹了selenium獲取當(dāng)前頁面的url、源碼、title的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評論

台安县| 百色市| 湘潭市| 阳信县| 张家港市| 洪洞县| 山东省| 莱芜市| 博湖县| 京山县| 靖安县| 梅河口市| 增城市| 吉首市| 昌乐县| 射阳县| 新源县| 甘洛县| 横山县| 碌曲县| 延津县| 博客| 诸暨市| 岗巴县| 察隅县| 巩义市| 玛沁县| 习水县| 都安| 叙永县| 太原市| 南部县| 阿鲁科尔沁旗| 米脂县| 彰武县| 赤壁市| 沙坪坝区| 中西区| 古蔺县| 水富县| 佛学|