Python爬取真氣網天氣資料
使用工具:pycharm,Chrome driver
使用庫:selenium
前言:
我們無時無刻不在呼吸著周圍的空氣,
可身邊的空氣質量怎樣呢?
嗯~~~
大多數人會沉思一會兒,
最後還是會說:不知道。
我們平時看到的AQI只是環境綜合指數,
有時並不能完全反應環境質量,
看來我們需要的是原始資料。
有了原始資料,
我們不但能分析現在的環境狀況,
甚至還能對未來的環境狀況做出自己的預測,
聽起來是不是很XX呢。
古同還沒找到直接在本頁面下載的方法,
各位朋友可以,
後臺回覆:可執行檔案,
可得到exe檔案,
無需安裝Python即可執行,
就算不會寫爬蟲,
也可以獲得原始資料啦。
以下第一第二步為必讀,
否則exe無法正常執行。
一、下載Chrome driver(必讀)
這一步是無論執行.py還是.exe,
都要進行的一步,
在這一步我們要安裝一個瀏覽器驅動外掛,
相當於為我們的.py和.exe安裝假肢。
首先,我們檢視我們的瀏覽器版本,

image
開啟後可以看到版本和作業系統位數,
我們要下載對應的驅動和Chrome版本相適應,
給大家推薦一個網址:
ofollow,noindex">http://blog.csdn.net/huilan_same/article/details/51896672
根據自己Chrome瀏覽器的版本對應下載。

image
二、安裝Chrome driver(必讀)
這裡需要對環境變數進行配置,
首先我們要找到Chrome瀏覽器的安裝位置,
最簡單的方法是找到Google Chrome的快捷方式,
右擊選擇“開啟檔案位置”,
將路徑複製下來,
例如我的路徑為:
C:\Users\Gutong\AppData\Local\Google\Chrome\Application
然後,開啟計算機——屬性

image
然後點選高階系統配置,

image
點選環境變數,

image
點選編輯,

image
將複製的Chrome路徑貼上到紅框中,
別忘了用分號(;)與前面的路徑分開,

image
最後將我們下載好的Chrome driver中的exe檔案粘到Chrome路徑下,

image
OK,前期工作結束了,
上面兩步是重點,
必須要學會的東西。
三、尋找提供原始資料的網站:
古同瀏覽了很多網站,
生態環境部官網、各市級環保網等等,
最後鎖定了真氣網,
網站資料來源真實可信,

image
歷史資料網頁連結:
https://www.aqistudy.cn/historydata/index.php

image
四、分析網頁:
由於網頁資料是隨時間進行變化的,
屬於動態網頁,
因此不宜採用靜態網頁的分析方法,
So我們選擇selenium
五、寫原始碼
首先引入所用庫:
# -*- coding:utf-8-*- #可以利用 webdriver 開啟一個瀏覽器 from seleniumimport webdriver #使時間中止至指定時間 import time
接著定義一個search()方法:
用來返回網頁的資訊,
def search(url): #利用get()方法獲取網頁資訊並返回 return driver.get(url)
接著再定義一個解析網頁的方法:
def parse_one_page(page): #查找出玩野中全部的 tr 標籤並賦給 tr_list tr_list =driver.find_elements_by_tag_name('tr') return tr_list
當然不能忘了儲存資料了,
def save_to_mysql(tr_list): #在 D 盤建立一個 TXT 格式檔案 with open(r'd:\data.txt','a',encoding='utf8') as f: for i in range(1, len(tr_list)): #找出 tr_list 中的全部 td 標籤 td_list =tr_list[i].find_elements_by_tag_name('td') dae = td_list[0].text AQI = td_list[1].text ql = td_list[2].text PM2 = td_list[3].text PM10 = td_list[4].text SO2 = td_list[5].text CO = td_list[6].text NO2 = td_list[7].text O3 = td_list[8].text #將所得原始資料寫入上面建立的 TXT 檔案 f.write('{} {} {} {} {} {} {} {} {}\n'.format(dae,AQI,ql,PM2,PM10,SO2,CO,NO2,O3))
定義主函式:
def main() #實現互動,輸入城市和時間 area = input('請輸入一個城市(例如[長春]):') year = input('請輸入一個年份(例如[2018]):') print('正在抓取'+ area + '市' + year + '年' + '空氣質量每日曆史資料:' ) print('由於抓取資料較多,請您耐心等待:') #定義全域性變數 driver global driver #開啟 Chrome 瀏覽器 driver = webdriver.Chrome() #利用迴圈獲取一年的原始資料 for i in range(1,13): if i<10: url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}0{}'.format(area,year,i) else: url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}{}'.format(area,year,i) page = search(url) time.sleep(1) tr_list = parse_one_page(page) save_to_mysql(tr_list) print('抓取完畢') print('檔案儲存在D:\data.txt')
最後呼叫主函式:
if __name__ =='__main__': main()
大功告成了!!!
撒花
完整程式碼如下:
# -*- coding:utf-8-*- #可以利用 webdriver 開啟一個瀏覽器 from seleniumimport webdriver #使時間中止至指定時間 import time def search(url): #利用get()方法獲取網頁資訊並返回 return driver.get(url) defparse_one_page(page): #查找出玩野中全部的 tr 標籤並賦給 tr_list tr_list =driver.find_elements_by_tag_name('tr') return tr_list defsave_to_mysql(tr_list): #在 D 盤建立一個 TXT 格式檔案 withopen(r'd:\data.txt','a',encoding='utf8') as f: for i in range(1, len(tr_list)): #找出 tr_list 中的全部 td 標籤 td_list =tr_list[i].find_elements_by_tag_name('td') dae = td_list[0].text AQI = td_list[1].text ql = td_list[2].text PM2 = td_list[3].text PM10 = td_list[4].text SO2 = td_list[5].text CO = td_list[6].text NO2 = td_list[7].text O3 = td_list[8].text #將所得原始資料寫入上面建立的 TXT 檔案 f.write('{} {} {} {} {} {} {} {} {}\n'.format(dae,AQI,ql,PM2,PM10,SO2,CO,NO2,O3)) def main() #實現互動,輸入城市和時間 area = input('請輸入一個城市(例如[長春]):') year = input('請輸入一個年份(例如[2018]):') print('正在抓取'+ area + '市' + year + '年' + '空氣質量每日曆史資料:' ) print('由於抓取資料較多,請您耐心等待:') #定義全域性變數 driver global driver #開啟 Chrome 瀏覽器 driver = webdriver.Chrome() #利用迴圈獲取一年的原始資料 for i in range(1,13): if i<10: url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}0{}'.format(area,year,i) else: url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}{}'.format(area,year,i) page = search(url) time.sleep(1) tr_list = parse_one_page(page) save_to_mysql(tr_list) print('抓取完畢') print('檔案儲存在D:\data.txt') if __name__ =='__main__': main()
個人公眾號:此地古同