Python 3 爬取城市歷史PM2.5數(shù)據(jù)

寫在前面:

基于python版本3,使用BeautifulSoup和requests庫。
因為近來成都的霧霾越來越嚴重,影響到的人群也是越來越多,一直想做一個PM2.5的統(tǒng)計,正好最近開始學(xué)習(xí)Python所有就拿它來練手了,新手不足之處還請指教。

正題:

對比了幾個可以查歷史數(shù)據(jù)的網(wǎng)站后,選取的網(wǎng)站是www.aqistudy.cn,此網(wǎng)站的數(shù)據(jù)易于Python抓取且來源于環(huán)保部官方數(shù)據(jù),從最早2013年12月到現(xiàn)在的記錄,歷史數(shù)據(jù)頁面如下圖。

圖 1 歷史數(shù)據(jù)首頁

這次是爬取熱門城市里的十個城市的歷史數(shù)據(jù)并保持為CSV格式,分析頁面源碼可以看到模式如下。


從這個大的<div class="hot">標簽里循環(huán)每一個 <li> 標簽即可以得到每個城市名以及城市的Url。

# 獲取城市名及城市的URL
def getcity():
    hotcitys = rq.get(Url,headers=headers)
    soup = BeautifulSoup(hotcitys.text, 'lxml')  #這里使用lxml來解析
    citynames = []
    cityurls = []
    citys = soup.find_all('a',limit=19)[-10:]     #分片的形式來獲取十個熱門城市
    for city in citys:
        cityurl = city.get('href')
        cityurls.append(cityurl)
        cityname = city.get_text()
        citynames.append(cityname)
    return cityurls,citynames
cityurls,citynames = getcity()

首先導(dǎo)入用到的幾個庫:

import requests as rq
import re
import io
from bs4 import BeautifulSoup

起始網(wǎng)址:Url='https://www.aqistudy.cn/historydata/
為了防止網(wǎng)站針對爬蟲的限制,把爬蟲偽裝成瀏覽器:
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' }
再從抓取到的城市月數(shù)據(jù)網(wǎng)址開始抓取每月數(shù)據(jù)的網(wǎng)址:

def getwebs(url):
    data = rq.get(url,headers=headers).text
    soup = BeautifulSoup(data, 'lxml')
    ahrefs = soup.find_all('a')          #找到所有的鏈接
    webs = []
    names = []

    for href in ahrefs:
        href = href.get('href')
        hrefd = re.findall('(.*?month=\d{6})',href)  #用正則來匹配每月
        if hrefd:
            urls = Url + hrefd[0]
            webs.append(urls)

    return webs

最后把每個城市對應(yīng)的詳細數(shù)據(jù)寫入到CSV文件保存即完成。

def Savepm25(webs,path):

    for web in webs:
        print('正在下載數(shù)據(jù)...'+web)
        data = rq.get(web,headers=headers).text

        soup = BeautifulSoup(data, 'lxml')

        pms = soup.find_all('td')

        aqis = []

        for pm in pms:
        
            data = pm.get_text()
            aqis.append(data)

        i = 0
        while i < 12:
            aqis.pop()
            i = i + 1

        with open(path+'.csv', 'a+') as f:
                
             i = 1
             for aqi in aqis:
                if i % 11 != 0:
                    f.write(aqi + ',')       # CSV表格里以','為分隔符
                else:
                    f.write(aqi + '\r\n')    #若是行尾則換行

                i = i + 1

這里with open(path+'.csv', 'a+') as f:,'a+'是以追加的方式添加數(shù)據(jù)到CSV文件。

最后寫一個循環(huán)來分別以 城市名.CSV 來保存到本地。

paths = []
for cityname in citynames:
    path = cityname + 'pm25'
    paths.append(path)
i = 0
for url in  cityurls:
    url = Url+url
    print(url)
    webs=getwebs(url)
    path = paths[i]
    Savepm25(webs,path)
    i = i + 1

寫在最后:

 本人剛開始學(xué)Python,很多地方?jīng)]有考慮周到,只實現(xiàn)了基本功能、代碼也不夠健壯,還請高手可以多指點!或許您的一句話可以讓我等新手少走些許彎路!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容