本文研究的主要是Python爬蟲(chóng)天氣預(yù)報(bào)的相關(guān)內(nèi)容,具體介紹如下。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),當(dāng)陽(yáng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:當(dāng)陽(yáng)等地區(qū)。當(dāng)陽(yáng)做網(wǎng)站價(jià)格咨詢:18982081108這次要爬的站點(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,觀察整個(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)求頭全部滿上懟進(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ì)403禁止訪問(wèn)服務(wù)器。
接下來(lái)就要考慮怎么請(qǐng)求不同月份的數(shù)據(jù)。
通過(guò)觀察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)行查詢了。
最后一個(gè)參數(shù)1495720234075,開(kāi)始以為是隨機(jī)數(shù),后來(lái)有朋友提醒這是unix時(shí)間戳,實(shí)際上就算去掉這個(gè),也能正常訪問(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}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:Python爬蟲(chóng)天氣預(yù)報(bào)實(shí)例詳解(小白入門(mén))-創(chuàng)新互聯(lián)
當(dāng)前地址:http://vcdvsql.cn/article10/jjcdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、定制網(wǎng)站、搜索引擎優(yōu)化、域名注冊(cè)、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容