欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲(chóng)天氣預(yù)報(bào)實(shí)例詳解(小白入門(mén))

 更新時(shí)間:2018年01月24日 09:52:52   作者:敲代碼的猴  
這篇文章主要介紹了Python爬蟲(chóng)天氣預(yù)報(bào)實(shí)例詳解(小白入門(mén)),詳細(xì)介紹了整個(gè)爬蟲(chóng)建立的流程,最后分享了實(shí)現(xiàn)代碼,很簡(jiǎn)潔,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是Python爬蟲(chóng)天氣預(yù)報(bào)的相關(guān)內(nèi)容,具體介紹如下。

這次要爬的站點(diǎn)是這個(gè):http://www.weather.com.cn/forecast/

要求是把你所在城市過(guò)去一年的歷史數(shù)據(jù)爬出來(lái)。

分析網(wǎng)站

首先來(lái)到目標(biāo)數(shù)據(jù)的網(wǎng)頁(yè) http://www.weather.com.cn/weather40d/101280701.shtml

我們可以看到,我們需要的天氣數(shù)據(jù)都是放在圖表上的,在切換月份的時(shí)候,發(fā)現(xiàn)只有部分頁(yè)面刷新了,就是天氣數(shù)據(jù)的那塊,而URL沒(méi)有變化。

這是因?yàn)榫W(wǎng)頁(yè)前端使用了JS異步加載的技術(shù),更新時(shí)不用加載整個(gè)頁(yè)面,從而提升了網(wǎng)頁(yè)的加載速度。

對(duì)于這種非靜態(tài)頁(yè)面,我們?cè)谡?qǐng)求數(shù)據(jù)時(shí),就不能簡(jiǎn)單的通過(guò)替換URL來(lái)請(qǐng)求不同的頁(yè)面。

著眼點(diǎn)要放在Network,觀(guān)察整個(gè)請(qǐng)求的過(guò)程,從中尋找突破口。

老規(guī)矩按下F12 > network,切換下頁(yè)面,發(fā)現(xiàn)多了一些東西,這就是切換月份,瀏覽器發(fā)出的請(qǐng)求,可以很清楚的看到請(qǐng)求頭和請(qǐng)求參數(shù)。

再來(lái)看看Response是怎樣的吧

真是沒(méi)想到,返回的居然是json格式的天氣數(shù)據(jù)!直接做 json 反序化就能變成字典的形式,省掉了我們解析 html 的麻煩呀。既然找到了數(shù)據(jù)所在的地方,就可以開(kāi)始嘗試構(gòu)建請(qǐng)求了。

構(gòu)建請(qǐng)求

先直接copy上面的Request URL,試下請(qǐng)求。http://d1.weather.com.cn/calendar_new/2017/101280701_201706.html?_=1495720234075
然后發(fā)現(xiàn)報(bào)錯(cuò)了,先把請(qǐng)求頭全部滿(mǎn)上懟進(jìn)去,發(fā)現(xiàn)可以正常的響應(yīng)。
但是我們還要分析下到底哪個(gè)參數(shù)不對(duì)出了問(wèn)題。經(jīng)過(guò)嘗試,發(fā)現(xiàn)請(qǐng)求頭里的Referer的原因,去掉就會(huì)報(bào)錯(cuò)。

這是因?yàn)檫@是瀏覽器發(fā)出請(qǐng)求時(shí),會(huì)通過(guò)Referer告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的,有些網(wǎng)站會(huì)對(duì)這個(gè)做驗(yàn)證,主要時(shí)為了防止別人盜鏈的問(wèn)題。

這個(gè)中國(guó)天氣網(wǎng),就是驗(yàn)證了Referer里的域名是不是自己的,不是的話(huà)就會(huì)403禁止訪(fǎng)問(wèn)服務(wù)器。

接下來(lái)就要考慮怎么請(qǐng)求不同月份的數(shù)據(jù)。

通過(guò)觀(guān)察URL,發(fā)現(xiàn)其實(shí)很簡(jiǎn)單,直接替換年月,就可以循環(huán)抓取,得到整年的數(shù)據(jù)。

那中間的101280701是什么意思呢,經(jīng)過(guò)請(qǐng)求不同的城市對(duì)比URL,我發(fā)現(xiàn)這是表示地理位置的一個(gè)數(shù)據(jù)。

前3位表示國(guó)家中國(guó),后6位依次表示,省份,城市和區(qū)縣。修改這里,就能實(shí)現(xiàn)對(duì)不同城市進(jìn)行查詢(xún)了。

最后一個(gè)參數(shù)1495720234075,開(kāi)始以為是隨機(jī)數(shù),后來(lái)有朋友提醒這是unix時(shí)間戳,實(shí)際上就算去掉這個(gè),也能正常訪(fǎng)問(wèn)數(shù)據(jù),沒(méi)什么影響。

解析數(shù)據(jù)

拿到數(shù)據(jù)以后,就可以開(kāi)始解析了。不過(guò)這里根本用不上x(chóng)path,直接用Json.load(),就能反序列化成json對(duì)象,從中取出字典,節(jié)省很多麻煩。需要注意的是,返回的40天的天氣數(shù)據(jù) fc40 字符串是這樣

var fc40 = [{"blue":"","c1":"","c2":"","cla":"history","date":"20151227","des":"歷史均值","fe":"","hgl":"17%","hmax":"17","hmin":"13","hol":"","jq":""
.....]}

前面的字符串需要去掉,才能反序列化,注意這里的json對(duì)象實(shí)際是個(gè)存儲(chǔ)字典的list[]。開(kāi)始想用正則,不過(guò)不熟沒(méi)弄好。后來(lái)發(fā)現(xiàn) python 字符串也能使用這樣的語(yǔ)法 [a:b] 來(lái)取出位置a到位置b的字符串,所以就直接用[11 : ], 就能取出fc40 后面的字符串,也很方便。

保存數(shù)據(jù)

因?yàn)閿?shù)據(jù)量比較大,就采用mongodb來(lái)做數(shù)據(jù)持久化。mongodb 我也是才學(xué)習(xí),參考了別人的教程,才做好了環(huán)境配置,過(guò)程打算總結(jié)到另一篇,這里就打算不多說(shuō)了。

因?yàn)樵镜姆帕颂鞖鈹?shù)據(jù)的字典里面有太多沒(méi)用的數(shù)據(jù),我只想提取出我想要的部分,就用了一個(gè)小技巧。

將想要的數(shù)據(jù)的key,保存成subkey這個(gè)字典,用 for in取出subkey中的key,再回到原本的dict中取出對(duì)應(yīng)的值,最后將這些鍵值對(duì),都存儲(chǔ)在一個(gè)subdict字典里,就完成了提取出子字典的功能。說(shuō)起來(lái)很麻煩,但是代碼卻很簡(jiǎn)單,這可能就是python的魅力吧。

subkey = {'date', 'hmax', 'hmin', 'hgl', 'fe', 'wk', 'time'}
subdict = {key: dict[key] for key in subkey}

然后我還做了個(gè)用中文替換的原來(lái)key的功能,只需要稍作修改,for in 取出來(lái)的是鍵值對(duì),然后用中文的value,替換英文的key,就ok了。

 subkey = {'date': '日期', 'hmax': '最高溫度', 'hmin': '最低溫度', 'hgl':
 '降水概率', 'fe': '節(jié)日', 'wk': '星期'}
 subdict = {value: dict[key] for key, value in subkey.items()}

最后的結(jié)果如下圖,這是用pycharm上的mongodb可視化插件Mongo Plugin看到的,在pycharm>settings>plugins里面可以搜索安裝。需要注意的是,默認(rèn)只顯示300條數(shù)據(jù)。想要看到更多,就在Row limit 上輸入總數(shù)就行。

Python的代碼非常短才30多行,就完成了爬蟲(chóng)的整個(gè)流程, 請(qǐng)求,解析,保存,一氣呵成,可謂是爬蟲(chóng)界的豪杰。

# encoding=utf-8
import requests
import json
import pymongo
import time

def request(year, month):
  url = "http://d1.weather.com.cn/calendar_new/" + year + "/101280701_" + year + month + ".html?_=1495685758174"
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
    "Referer": "http://www.weather.com.cn/weather40d/101280701.shtml",
  }
  return requests.get(url, headers=headers)

def parse(res):
  json_str = res.content.decode(encoding='utf-8')[11:]
  return json.loads(json_str)

def save(list):
  subkey = {'date': '日期', 'hmax': '最高溫度', 'hmin': '最低溫度', 'hgl': '降水概率', 'fe': '節(jié)日', 'wk': '星期', 'time': '發(fā)布時(shí)間'}
  for dict in list:
    subdict = {value: dict[key] for key, value in subkey.items()}  #提取原字典中部分鍵值對(duì),并替換key為中文
    forecast.insert_one(subdict)                  #插入mongodb數(shù)據(jù)庫(kù)

if __name__ == '__main__':
  year = "2016"
  month = 1
  client = pymongo.MongoClient('localhost', 27017)  # 連接mongodb,端口27017
  test = client['test']               # 創(chuàng)建數(shù)據(jù)庫(kù)文件test
  forecast = test['forecast']            # 創(chuàng)建表forecast
  for i in range(month, 13):
    month = str(i) if i > 9 else "0" + str(i)   #小于10的月份要補(bǔ)0
    save(parse(request(year, month)))       

time.sleep(1)

總結(jié)

以上就是本文關(guān)于Python爬蟲(chóng)天氣預(yù)報(bào)實(shí)例詳解(小白入門(mén))的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • python numpy之np.random的隨機(jī)數(shù)函數(shù)使用介紹

    python numpy之np.random的隨機(jī)數(shù)函數(shù)使用介紹

    這篇文章主要介紹了python numpy之np.random的隨機(jī)數(shù)函數(shù)使用介紹,需要的朋友可以參考下
    2019-10-10
  • 利用python?OpenCV去除視頻水印

    利用python?OpenCV去除視頻水印

    這篇文章主要介紹了利用python?OpenCV去除視頻水印,下面我們將利用視頻的某一幀將圖片的一些污點(diǎn)去掉,代碼先從視頻中導(dǎo)出一幀圖片,然后統(tǒng)計(jì)需要?jiǎng)h除按鈕的坐標(biāo)位置,然后再對(duì)視頻中的每一幀圖像做處理的函數(shù),下面操作過(guò)程需要的小伙伴可以參考一下
    2022-02-02
  • Python enumerate函數(shù)功能與用法示例

    Python enumerate函數(shù)功能與用法示例

    這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)針對(duì)列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03
  • Python3+Appium安裝及Appium模擬微信登錄方法詳解

    Python3+Appium安裝及Appium模擬微信登錄方法詳解

    這篇文章主要介紹了Python3+Appium安裝及使用方法詳解,需要的朋友可以參考下
    2021-02-02
  • Python循環(huán)控制詳解

    Python循環(huán)控制詳解

    本文介紹了Python編程語(yǔ)言中關(guān)于for循環(huán)和if條件控制的一些基本使用,包含了單層循環(huán)的退出機(jī)制和多層循環(huán)的退出機(jī)制,使得我們?cè)跐M(mǎn)足特定條件時(shí),可以直接結(jié)束多層循環(huán),需要的朋友可以參考下
    2024-07-07
  • python人工智能tensorflow函數(shù)tf.nn.dropout使用方法

    python人工智能tensorflow函數(shù)tf.nn.dropout使用方法

    這篇文章主要為大家介紹了python人工智能tensorflow函數(shù)tf.nn.dropout使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python讀取Windows注冊(cè)表的示例代碼

    python讀取Windows注冊(cè)表的示例代碼

    本文主要介紹了python讀取Windows注冊(cè)表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 在python3中實(shí)現(xiàn)查找數(shù)組中最接近與某值的元素操作

    在python3中實(shí)現(xiàn)查找數(shù)組中最接近與某值的元素操作

    今天小編就為大家分享一篇在python3中實(shí)現(xiàn)查找數(shù)組中最接近與某值的元素操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 2022最新Python日志庫(kù)logging總結(jié)

    2022最新Python日志庫(kù)logging總結(jié)

    這篇文章主要介紹了2022最新Python日志庫(kù)logging總結(jié),Python logging 庫(kù)設(shè)計(jì)的真的非常靈活,如果有特殊的需要還可以在這個(gè)基礎(chǔ)的 logging 庫(kù)上進(jìn)行改進(jìn),創(chuàng)建新的 Handler 類(lèi)解決實(shí)際開(kāi)發(fā)中的問(wèn)題,需要的朋友可以參考下
    2022-05-05
  • Python3.x+pyqtgraph實(shí)現(xiàn)數(shù)據(jù)可視化教程

    Python3.x+pyqtgraph實(shí)現(xiàn)數(shù)據(jù)可視化教程

    這篇文章主要介紹了Python3.x+pyqtgraph實(shí)現(xiàn)數(shù)據(jù)可視化教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03

最新評(píng)論