最近做了一點(diǎn)微小的工作趟咆,從環(huán)保部數(shù)據(jù)中心的官網(wǎng)中爬取每個(gè)城市逐日的AQI(空氣質(zhì)量指數(shù))添瓷,現(xiàn)記錄一下過(guò)程,方便日后回憶值纱。
這也是第一次用Python寫爬蟲鳞贷,發(fā)現(xiàn)python真的是蠻容易上手的一個(gè)工具,學(xué)會(huì)基本的語(yǔ)法后虐唠,看一些案例悄晃,自己動(dòng)手調(diào)試,大概一周時(shí)間斷斷續(xù)續(xù)寫完的。
寫代碼永遠(yuǎn)是最后的步驟妈橄,在此之前庶近,你需要對(duì)自己做什么,怎么完成有一個(gè)規(guī)劃眷蚓,這樣做起來(lái)才事半功倍鼻种。
觀察所要抓取的數(shù)據(jù)——所要抓取的信息怎么得到——如何抓取下一頁(yè)信息——怎樣保存
通過(guò)分析,我找到網(wǎng)頁(yè)中所有抓取的文件都保存在名為report1這個(gè)表格中沙热;
http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp?city=&startdate=2016-12-02%2012:00&enddate=2016-12-02%2012:00&page=2
網(wǎng)址的構(gòu)造如上所示叉钥,表示2016年12月2日中午12點(diǎn)AQI數(shù)據(jù)的第二頁(yè),據(jù)此分析篙贸,我們就可以構(gòu)造每一頁(yè)對(duì)應(yīng)的網(wǎng)址投队;
最后通過(guò)xlwt庫(kù)將我們抓取的數(shù)據(jù)保存到EXCEL中。
導(dǎo)入所需要的庫(kù)
from urllib2 import urlopen, Request from bs4 import BeautifulSoup import xlwt import datetime
訪問(wèn)網(wǎng)址
def getBS(url):
header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
req = Request(url, headers=header)
html = urlopen(req)
bsObj = BeautifulSoup(html, 'html.parser')
return bsObj
- 找到總頁(yè)數(shù)
def getTotalPagesNum(htmltree):
a = htmltree.findAll('font', {'color': '#004e98'})
return a[1].get_text()
- 打印每一頁(yè)的信息
def getPageInfo(htmltree):
# 找到空氣質(zhì)量的表格
table = htmltree.find('table', {'id': 'report1'})
rows = table.findAll('tr', {'height': '30'})
# 將每一條數(shù)據(jù)輸出到屏幕且保存到Items爵川,Items中保存了所有AQI信息
for i in range(2, len(rows)):
data = rows[i].findAll('td')
AQIItems = str()
for item in data:
AQIItems += item.get_text() + ' '
print AQIItems
Items.append(AQIItems)
- 打印表頭和每一頁(yè)的信息
def printInfo(BSObj, baseurl):
# 找到總頁(yè)碼數(shù),在屏幕上打印出表頭
pages = getTotalPagesNum(BSObj)
table = BSObj.find('table', {'id': 'report1'}).findAll('tr', {'height': '30'})
Attrs = table[1].findAll('td')
TableHeader = ''
for Attr in Attrs:
TableHeader += Attr.get_text() + ' '
print TableHeader # 顯示表頭字段名稱
# 在屏幕上顯示查詢結(jié)果并保存
for i in range(1, int(pages) + 1):
url = baseurl + '&page=' + str(i)
bs = getBS(url)
getPageInfo(bs)
- 保存到EXCEL
def saveExcel(AQIdata):
attrs = ['序號(hào)', '城市', '時(shí)間', 'AQI指數(shù)', '空氣質(zhì)量級(jí)別' , '首要污染物']
wbk = xlwt.Workbook(encoding='utf-8')
sheet1 = wbk.add_sheet('sheet1')
cursor = 0
# 輸入各字段名稱
for attr in attrs:
sheet1.write(0, cursor, attr)
cursor += 1
row = 1
for AQIitem in AQIdata:
lis = AQIitem.split(' ')
col = 0
for ls in lis:
sheet1.write(row, col, ls)
col += 1
row += 1
filename = ur'AQIData.xls'
wbk.save(filename)
將上面的函數(shù)綜合起來(lái)敷鸦,寫到主函數(shù)中:
def main():
print '- '*30
# startdate = raw_input('請(qǐng)輸入起始日期(如2016-09-07):')
# starttime = raw_input('請(qǐng)輸入起始時(shí)間(如20:00):')
# enddate = raw_input('請(qǐng)輸入結(jié)束日期(如2016-09-08):')
# endtime = raw_input('請(qǐng)輸入結(jié)束時(shí)間(如18:00):')
# isallcity = raw_input('是否查詢所有城市?(Y/N)')
# if isallcity[0].lower() == 'n':
# city = raw_input('請(qǐng)輸入要查詢城市(如北京市):')
# else:
# city = ''
# 打開空氣質(zhì)量界面
baseurl = 'http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp?city=&startdate=2016-10-10%2000:00&enddate=2016-10-17%2000:00'
BSObj = getBS(baseurl)
global Items
Items = []
# 將信息輸出到屏幕
printInfo(BSObj, baseurl)
# 存儲(chǔ)到表格中
saveExcel(Items)
備注:
1寝贡、實(shí)際情況下扒披,此網(wǎng)址查詢速度極慢,我零零散散下了16個(gè)txt文件圃泡,才下完6w+條數(shù)據(jù)碟案。
2、此處為了方面颇蜡,直接將網(wǎng)址寫到了代碼里价说,可根據(jù)自己的需要,設(shè)計(jì)一些交互式操作风秤,參考主函數(shù)里面的注釋部分鳖目。