寫在前面:
基于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ù)頁面如下圖。

這次是爬取熱門城市里的十個城市的歷史數(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)了基本功能、代碼也不夠健壯,還請高手可以多指點!或許您的一句話可以讓我等新手少走些許彎路!