前言
之前寫過一篇關(guān)于可視化爬蟲spiderflow的文章,介紹了基本語法并實戰(zhàn)了某校園新聞數(shù)據(jù)的爬取。
還有一篇文章介紹了基于docker-compose快速部署spiderflow的過程,需要部署的話可參考該文章。
文章鏈接如下:
- 可視化爬蟲框架spiderflow入門及實戰(zhàn)
- 【工作記錄】基于docker-compose快速部署springboot應(yīng)用的實踐
本文繼續(xù)記錄一下天氣數(shù)據(jù)爬取的過程,供實現(xiàn)參考。
原始需求
近期接到運營中心一個業(yè)務(wù)需求,希望能獲取到指定區(qū)域的天氣數(shù)據(jù),用于大屏展示,需要的參數(shù)包含:
- 該區(qū)域?qū)崟r天氣, 如氣溫、風(fēng)向、AQI指數(shù)等
- 該區(qū)域3天及7天預(yù)報
- 該區(qū)域過去最近24小時氣溫、降水、相對濕度、空氣質(zhì)量等數(shù)據(jù)
- 該區(qū)域?qū)?4小時預(yù)報,以3小時為間隔
- 氣象臺發(fā)布的該區(qū)域的預(yù)警信息
需求拆解
分析原始需求可分為三部分?jǐn)?shù)據(jù):
- 區(qū)域管理
- 天氣數(shù)據(jù)
- 預(yù)警信息
具體說明如下:
- 區(qū)域管理中根據(jù)指定字段(比如enabled字段為1)來確定爬取數(shù)據(jù)的范圍。
- 天氣數(shù)據(jù)用于頁面展示,包含需求里天氣相關(guān)的數(shù)據(jù)
- 預(yù)警數(shù)據(jù)用于頁面展示預(yù)警信息,需要預(yù)警來源、預(yù)警日期、預(yù)警內(nèi)容、預(yù)警標(biāo)題、圖標(biāo)
數(shù)據(jù)來源網(wǎng)站
1、關(guān)于天氣數(shù)據(jù)的獲取我們?nèi)≈醒霘庀笈_的數(shù)據(jù),網(wǎng)址為: 西安-天氣預(yù)報 (nmc.cn)
? 上面網(wǎng)址是在頁面上搜索框輸入了西安后查詢的數(shù)據(jù)頁面,頁面展示內(nèi)容如下:
可以看到官方這個頁面上包含了我們需求提到的天氣相關(guān)的所有數(shù)據(jù)。
2、預(yù)警數(shù)據(jù)我們使用的網(wǎng)頁為: 中央氣象臺官方網(wǎng)站-預(yù)警信號 (nmc.cn)
列表里可以選擇省份以獲取指定省份的預(yù)警數(shù)據(jù),這里我們以陜西省為例,頁面展示如下:
詳情頁我們需要獲取到預(yù)警內(nèi)容用于展示。
開始設(shè)計
前期準(zhǔn)備
- 部署好spiderflow爬蟲,可正常訪問
? 部署過程可參考【工作記錄】基于docker-compose快速部署springboot應(yīng)用的實踐
-
準(zhǔn)備一個數(shù)據(jù)庫用于存放對應(yīng)數(shù)據(jù)
要求能通過spiderflow服務(wù)器訪問到該數(shù)據(jù)庫即可
-
通過spiderflow的頁面,添加上面準(zhǔn)備好的數(shù)據(jù)源,用于后續(xù)爬蟲中的數(shù)據(jù)保存
頁面數(shù)據(jù)來源分析
進入西安天氣預(yù)報頁面,網(wǎng)址為西安-天氣預(yù)報 (nmc.cn)
打開開發(fā)者工具,找到網(wǎng)絡(luò)-Fetch/XHR,可以看到如下界面:
可以看到區(qū)域數(shù)據(jù)是通過接口請求到的,在標(biāo)頭和負載可以看到具體的請求地址可參數(shù)。
在區(qū)域數(shù)據(jù)下面還有另外一個接口數(shù)據(jù),如下:
具體結(jié)構(gòu)如下:
至此天氣相關(guān)數(shù)據(jù)就基本涵蓋全了,只需要獲取到相關(guān)數(shù)據(jù)并保存入庫即可。
繼續(xù)打開預(yù)警列表頁面,選擇陜西省,打開開發(fā)者工具,找到網(wǎng)絡(luò)-Fetch/XHR
這樣就找到了預(yù)警列表和預(yù)警內(nèi)容的數(shù)據(jù),同樣需要獲取到然后入庫保存即可。
設(shè)計爬蟲-區(qū)域數(shù)據(jù)獲取與保存
-
打開爬蟲web界面,進入爬蟲列表,點擊添加爬蟲,命名為天氣區(qū)域數(shù)據(jù)獲取
-
拖入需要的組件并連接起來,分別是爬蟲組件、循環(huán)組件和SQL組件,配置如下:
說明如下:
-
配置的地址即上面提到的獲取區(qū)域數(shù)據(jù)的地址,爬蟲完成后會得到一個
resp
的變量,也就是返回的json數(shù)據(jù),我們可以通過${resp.json}
獲取到變量的數(shù)據(jù)。 -
循環(huán)組件配置循環(huán)或集合參數(shù)為
${rs.json}
, 添加循環(huán)后可以得到item和index兩個變量分別對應(yīng)循環(huán)中的每一項和循環(huán)中的索引。 -
執(zhí)行SQL組件需要配置鏈接的數(shù)據(jù)源及需要執(zhí)行的SQL腳本,腳本中可使用流程中的變量,這里我們用到的就是
item
執(zhí)行SQL組件配置如下圖:
說明如下:
-
腳本很簡單跟正常的sql差不多,只不過里面的變量是通過
#${XXx}#
來寫的。 -
這里示例的是mysql數(shù)據(jù)庫,其他數(shù)據(jù)庫如有必要根據(jù)語法做相應(yīng)修改即可。
-
表結(jié)構(gòu)也比較簡單,就截圖中的字段加上一個ID自增主鍵和create_time創(chuàng)建時間,建表語句就不在這里貼了。
- 設(shè)計完成后點擊工具欄的保存,可以點擊工具欄旁邊的側(cè)三角按鈕運行,然后觀察數(shù)據(jù)庫的數(shù)據(jù)即可,正常情況下不報錯數(shù)據(jù)就可以正常入庫了。
至此區(qū)域數(shù)據(jù)爬取并保存完成。
設(shè)計爬蟲-天氣數(shù)據(jù)獲取與保存
前面我們提到區(qū)域表中存在一個字段enabled,如果為1的話我們才爬取它的數(shù)據(jù),所以在爬蟲中應(yīng)該是這樣一個流程:
- 先查詢出enabled值為1的所有區(qū)域數(shù)據(jù),
- 循環(huán)獲取天氣數(shù)據(jù)
- 保存入庫
具體配置過程如下:
-
回到爬蟲列表繼續(xù)添加爬蟲,命名為天氣數(shù)據(jù)獲取
-
拖入相關(guān)組件并配置
? 說明如下:
? 1. 第一個執(zhí)行SQL組件是為了篩選出所有enabled為1的區(qū)域數(shù)據(jù),配置的sql也很簡單,
select * from `mapdesign`.weather_zone where enabled = 1;
執(zhí)行完成后會得到一個rs的變量,可以通過rs.json
將數(shù)據(jù)轉(zhuǎn)換成json結(jié)構(gòu)方便后續(xù)使用, 通過${rs.json}
來取值。
? 2. 循環(huán)的集合配置的就是上面sql的結(jié)果: ${rs.json}
? 循環(huán)流程后會得到item和index兩個流程變量,分別對應(yīng)每一條數(shù)據(jù)和集合中的索引。
? 3. 爬蟲組件配置如下:
?
主要配置的就是個URL,可以根據(jù)頁面上的接口地址看出拼接規(guī)律,item.code就是區(qū)域數(shù)據(jù)中的code值。
爬蟲完成后會得到一個resp
的變量, 可以通過resp.json
轉(zhuǎn)換成json結(jié)構(gòu),通過${resp.json}
來取值使用。
? 4. 定義變量
? 為方便sql中變量的使用,我們可以使用定義變量組件提前定義好一些變量及其取值規(guī)則。
? 具體配置如下:
結(jié)合上面分析的天氣數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),相對來說比較好理解,不做贅述。
? 5. 執(zhí)行SQL
? 前面已經(jīng)定義好了變量,sql中便可以通過#${變量名}#
來使用了。
? 腳本配置如下:
insert into mapdesign.weather_data(`date`, city_code, `real`, `predict`, `last`, update_time, publish_time)
values(date(now()), #${item.code}#, #${real}#, #${predict}#, #${last}#, now(), #${pt}#)
on duplicate key update `real`=#${real}#, `predict`=#${predict}#, `last`=#${last}#, update_time=now(), publish_time=#${pt}#
? weather_data表設(shè)計比較簡單,所有數(shù)據(jù)都是以json結(jié)構(gòu)存儲的,除腳本中涉及到的字段外還有個ID自增主鍵。
? 這里的數(shù)據(jù)保存設(shè)計就比較隨意了,各位可以根據(jù)自己的喜好自行設(shè)計保存即可。
-
完成后點擊工具欄的保存按鈕,然后可以點擊保存按鈕右側(cè)的側(cè)三角來運行,觀察數(shù)據(jù)庫數(shù)據(jù)即可。
正常情況不保錯的話就可以正常入庫了。
結(jié)果數(shù)據(jù)如下:
至此天氣數(shù)據(jù)的獲取與保存就完成了。
設(shè)計爬蟲-預(yù)警數(shù)據(jù)獲取與保存
預(yù)警數(shù)據(jù)涉及到列表數(shù)據(jù)和詳情數(shù)據(jù)的獲取,需要兩個爬蟲和一個循環(huán),設(shè)計如下流程:
說明如下:
- 第一個爬蟲獲取的是列表,還是以陜西省為例,配置如下:
-
定義變量
在預(yù)警列表頁面隨便點擊一個預(yù)警進入詳情,可以看到詳情頁面的地址拼接方式為
"http://www.nmc.cn/publish/alarm/"+ ${item.id}.html
, 這里定義的變量就是為了取到所有的列表數(shù)據(jù)json變量名為
datalist
, 變量值為${resp.json.jsonpath("data").jsonpath("page").get("list")}
-
循環(huán)
循環(huán)組件不過多解釋,循環(huán)的即可就是上面定義好的
datalist
, 即${datalist}
-
爬蟲
這個爬蟲就是為了獲取詳情頁面數(shù)據(jù)的,url配置為:
http://www.nmc.cn/publish/alarm/${item.id}.html
需要注意的是這里獲取到的是一個html頁面,我們需要通過路徑匹配來取到頁面中我們需要的數(shù)據(jù)。
-
定義變量
這里主要是為了取到詳情頁面中的預(yù)警內(nèi)容數(shù)據(jù)。
配置變量名為
alarmContent
,變量值為${resp.html.selector("#alarmtext>p").text()}
。這個表達式的含義就是說
取html中的id為alarmtext下面的p標(biāo)簽的文本內(nèi)容
-
執(zhí)行SQL
除了alarmContent之外其余的數(shù)據(jù)都可以通過列表取到,如
id, publish_time, title, icon
等,在sql中使用#${item.xxx}#
即可取到。最終配置的sql腳本如下:
insert into `mapdesign`.alarm_data(alarm_id, title, icon, url, publish_time, update_time, alarm_content) values(#${item.alertid}#, #${item.title}#, #${item.pic}#, #${item.url}#, #${item.issuetime}#, now(), #${alarmContent}#) on duplicate key update title = #${item.title}#, alarm_content=#${alarmContent}#
庫名、表名、字段名及語法均可根據(jù)實際情況進行修改。
設(shè)計完成后保存運行,沒有報錯的話數(shù)據(jù)就可以正常入庫了。
最終獲取到的預(yù)警數(shù)據(jù)如下:
至此預(yù)警數(shù)據(jù)獲取與保存就完成了。
結(jié)語
本文記錄了從分析到實踐到測試完成天氣數(shù)據(jù)爬取的過程,記錄的比較細致。
作為一種實現(xiàn)思路,希望能對大家完成相關(guān)業(yè)務(wù)有所幫助。
對以上內(nèi)容有任何疑問或者建議歡迎留言評論,看到后會及時回復(fù)~~~文章來源:http://www.zghlxwxcb.cn/news/detail-502626.html
創(chuàng)作不易,歡迎一鍵三連~~~文章來源地址http://www.zghlxwxcb.cn/news/detail-502626.html
到了這里,關(guān)于【工作記錄】基于可視化爬蟲spiderflow實戰(zhàn)天氣數(shù)據(jù)爬取@20230618的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!